proxy_pass路径处理取决于location和proxy_pass末尾斜杠的组合:带斜杠时自动剥离location前缀,不带斜杠时原样转发;正则匹配需用rewrite显式控制;多级版本可结合命名捕获变量动态拼接。

proxy_pass 路径截断不是“删掉一部分”,而是 Nginx 按规则自动裁剪再拼接的过程。真正起作用的,是 proxy_pass 目标地址末尾有没有斜杠,以及 location 定义是否带尾斜杠——两者配合,决定路径怎么剥离、怎么转发。
带斜杠:自动剥离 location 前缀
这是最常用也最安全的方式。只要 proxy_pass 后面以 / 结尾(比如 http://backend/ 或 http://backend/v1/),Nginx 就会把匹配到的 location 前缀整个去掉,只把剩余路径拼到目标地址后面。
- 配置:
location /api/v1/ { proxy_pass http://localhost:8080/; } - 请求
/api/v1/users→ 后端收到/users - 请求
/api/v1/admin/login→ 后端收到/admin/login - 注意:
location和proxy_pass都要带尾斜杠,否则可能误截(比如location /api匹配/api123,会错把123当作剩余路径)
不带斜杠:原样转发整条路径
proxy_pass 后没斜杠(如 http://backend 或 http://backend/v1),Nginx 就不做裁剪,直接把客户端原始请求路径追加过去。
- 配置:
location /service { proxy_pass http://backend; } - 请求
/service/info→ 后端收到/service/info - 配置:
location /api/ { proxy_pass http://backend/v1; } - 请求
/api/users→ 后端收到/v1users(不是/v1/users!中间缺分隔符) - 这种写法容易出错,除非你明确需要保留前缀或做特殊拼接,否则不推荐
正则匹配必须用 rewrite 显式控制
当 location 使用 ~、~* 或 = 时,Nginx 无法自动推断要截多少,proxy_pass 后不能带任何路径(包括结尾 /),否则配置加载失败。
- 正确写法:
location ~ ^/v2/(.*)$ { rewrite ^/v2/(.*)$ /api/$1 break; proxy_pass http://backend; } -
break表示重写后不再重新匹配 location,直接走当前块的 proxy_pass - 避免用
last,否则可能触发循环匹配或误入其他 location 块 - 捕获组
$1必须与正则括号严格对应,否则转发为空或路径错乱
多级版本映射可结合变量动态拼接
如果要支持 /api/v1/xxx、/api/v2/xxx 分别转到不同后端路径,可以用命名捕获 + 变量拼接:
- 配置:
location ~ ^/api/(?<version>v\d+)/(.*)$ { proxy_pass http://backend/$version/$2; proxy_set_header X-API-Version $version; }</version> - 请求
/api/v1/users→ 后端收到/v1/users - 请求
/api/v2/posts→ 后端收到/v2/posts - 同时还能通过 header 把版本信息透传给后端,方便路由或兼容处理











