1. 程式人生 > >Nginx之proxy_pass指令url反斜杠作用

Nginx之proxy_pass指令url反斜杠作用

表達式 表達 $1 代理 進行 規則 兩種 最終 所有

在nginx中配置proxy_pass代理轉發時,其後面的url中反斜杠/ 的匹配處理時常出現意想不到的問題發生,以下說明兩種情況:
(1)如果在proxy_pass後面的url加/,表示絕對根路徑;
(2)如果在proxy_pass後面的url沒有/,表示相對路徑,把匹配的路徑部分也給代理走。

下面六種情況分別用 http://127.0.0.1/proxy/test.html 進行訪問測試

第一種情況:

location /proxy/ {
        proxy_pass http://127.0.0.1/;
}

最終會被代理到URL:http://127.0.0.1/test.html

第二種情況(相對於第一種,最後少一個 / ):

location /proxy/ {    
    proxy_pass http://127.0.0.1;    
}

最終會被代理到URL:http://127.0.0.1/proxy/test.html

第三種情況:

location /proxy/ {    
    proxy_pass http://127.0.0.1/aaa/;    
}

最終會被代理到URL:http://127.0.0.1/aaa/test.html

第四種情況(相對於第三種,最後少一個 / ):

location /proxy/ {    
    proxy_pass http://127.0.0.1/aaa;    
}

最終會被代理到URL:http://127.0.0.1/aaatest.html

* 第五種情況(定義了一個正則表達式,那麽在URl部分沒有轉換發生):

location ~ ^/proxy/ {    
    proxy_pass http://127.0.0.1/aaa;    
}

最終會被代理到URL:http://127.0.0.1/proxy/test.html

最佳寫法為:

location ~ ^/proxy/ {    
    proxy_pass http://127.0.0.1;    
}

* 第六種情況(有rewrite規則改變URl,那也不會發生轉換):

location /proxy/ { 
            rewrite   /proxy/(.*)$   /index.php?page=$1 break;    # break標記用於立即停止rewrite模塊的所有指令
    proxy_pass http://127.0.0.1/aaa;    
}

最終會被代理到URL:http://127.0.0.1/index.php?page=test.html

最佳寫法為:

location /proxy/ { 
            rewrite   /proxy/(.*)$   /index.php?page=$1 break;
    proxy_pass http://127.0.0.1;    
}

Nginx之proxy_pass指令url反斜杠作用