Nginx 中 proxy_pass
配置**帶 /
和不帶 /
**,核心區別在于 路徑拼接規則 不同,以下通過 實例對比 詳細說明:
一、基礎規則
proxy_pass | | |
---|
不帶 / (如 proxy_pass http://backend ) | 會把 location 匹配的路徑完整拼接到代理地址后 | |
帶 / (如 proxy_pass http://backend/ ) | 會裁剪掉 location 匹配的路徑前綴,再拼接剩余路徑 | 代理地址 + (請求路徑 - location 匹配前綴) |
二、實例驗證(以 location /app
為例)
場景 1:proxy_pass
不帶 /
配置:
location /app {
proxy_pass http://127.0.0.1:8080;
}
請求:http://yourdomain/app/user/1
實際代理到:http://127.0.0.1:8080/app/user/1
(邏輯:proxy_pass
地址 + location
匹配的完整路徑 /app
+ 剩余路徑 /user/1
)
場景 2:proxy_pass
帶 /
配置:
location /app {
proxy_pass http://127.0.0.1:8080/;
}
請求:http://yourdomain/app/user/1
實際代理到:http://127.0.0.1:8080/user/1
(邏輯:proxy_pass
地址 /
+ 裁剪 location
前綴 /app
后的剩余路徑 /user/1
)
場景 3:更復雜的 location
(帶后綴 /
)
配置:
location /app/ { # location 匹配以 /app/ 結尾的路徑
proxy_pass http://127.0.0.1:8080/api; # 不帶 /
}
請求:http://yourdomain/app/user/1
實際代理到:http://127.0.0.1:8080/api/app/user/1
(邏輯:proxy_pass
地址 api
+ location
匹配的完整路徑 /app/
+ 剩余路徑 user/1
)
場景 4:location
和 proxy_pass
都帶 /
配置:
location /app/ {
proxy_pass http://127.0.0.1:8080/api/; # 帶 /
}
請求:http://yourdomain/app/user/1
實際代理到:http://127.0.0.1:8080/api/user/1
(邏輯:proxy_pass
地址 api/
+ 裁剪 location
前綴 /app/
后的剩余路徑 user/1
)
三、典型應用場景
場景 A:后端服務需要完整路徑
若后端服務(如 Tomcat)的接口路徑是 /app/api
,需保留 location
路徑,用 不帶 /
的配置:
location /app {
proxy_pass http://backend; # 不帶 /,保留 /app 路徑
}
場景 B:后端服務是根路徑(如靜態資源服務器)
若后端服務直接部署在根路徑(如 http://backend/
就是靜態資源根),用 帶 /
的配置裁剪前綴:
location /static {
proxy_pass http://backend/; # 帶 /,裁剪 /static 前綴
}
四、總結對比表
| proxy_pass | | |
---|
| proxy_pass http://b | http://b | http://b/app/user |
| proxy_pass http://b/ | http://b/ | http://b/user |
| proxy_pass http://b/api | http://b/api | http://b/api/app/user |
| proxy_pass http://b/api/ | http://b/api/ | http://b/api/user |
核心口訣:
- 帶
/
:裁剪 location
匹配的路徑前綴,再拼接。 - 不帶
/
:把 location
匹配的路徑完整拼到代理地址后。
根據后端服務的路徑需求,選對應寫法即可解決 路徑拼接異常 或 跳轉丟失路徑 問題~
閱讀原文:原文鏈接
該文章在 2025/7/1 23:23:48 編輯過