nginx
location ^~ /task/ { # 這樣,當您訪問 http://hostname:port/task/test 時,# 請求會被轉發到 proxy_pass /test,注意 /task/ 前綴在轉發時被去掉了。proxy_pass http://192.168.86.199:8805/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
當您希望保留原始請求的 URI 時,您應該在 proxy_pass 指令中使用 ;
來結束地址部分,然后在后面添加 proxy_set_header Host $host; 來確保請求頭的 Host 字段被正確設置。
請注意,我在 proxy_pass 指令的末尾添加了一個斜杠 /。這是非常重要的,因為它告訴 Nginx 在轉發請求時去掉匹配的前綴(在這個例子中是 /task/)。如果省略了這個斜杠,Nginx 會將完整的原始 URI(包括 /task/ 前綴)轉發到后端服務器
。
補充
Nginx 的匹配順序是基于配置文件中的 location
塊和它們的指令前綴。下面是 Nginx 匹配順序的詳細說明:
-
精確匹配:
如果請求的 URI 與location
塊中的路徑完全匹配(以=
開頭),則 Nginx 會選擇該location
塊進行處理。 -
最長前綴匹配:
如果沒有精確匹配,Nginx 會進行最長前綴匹配。它會選擇路徑最長的location
塊,其中路徑可以是普通字符串(不帶^~
或正則表達式)或帶有^~
前綴的路徑。如果找到以^~
開頭的location
塊,Nginx 會立即停止搜索并使用該塊,即使存在其他更長的普通字符串路徑。 -
正則表達式匹配:
如果最長前綴匹配未找到匹配的location
塊,Nginx 會檢查以~
或~*
開頭的location
塊,這些塊使用正則表達式來匹配請求的 URI。~
表示區分大小寫的正則表達式匹配,而~*
表示不區分大小寫的匹配。Nginx 會按照配置文件中的順序逐個檢查這些正則表達式,直到找到第一個匹配的location
塊。 -
默認處理:
如果以上三個步驟都沒有找到匹配的location
塊,Nginx 會使用默認的location
塊。默認的location
塊通常是一個以/
開頭的普通字符串路徑,它會匹配所有未被其他location
塊捕獲的請求。
以下是一個簡單的示例配置,展示了 Nginx 的匹配順序:
server {listen 80;server_name example.com;location = /exact-match {# 處理精確匹配的請求}location ^~ /prefix-match {# 處理以 "prefix-match" 開頭的最長前綴請求}location / {# 處理所有其他請求}location ~* \.php$ {# 處理所有以 ".php" 結尾的請求,不區分大小寫}location ~ \.jpg$ {# 處理所有以 ".jpg" 結尾的請求,區分大小寫}
}
在這個示例中,如果請求是 /exact-match
,Nginx 會選擇第一個 location
塊。如果請求是 /prefix-match/something
,Nginx 會選擇第二個 location
塊,因為 ^~
前綴指定了最長前綴匹配。對于所有其他請求,Nginx 會按照配置文件中的順序繼續檢查正則表達式匹配,或者最終使用默認的第三個 location
塊。