proxy_pass 本身不动态处理路径,真正的动态路径匹配与改写依赖 location 规则与 rewrite 指令协同:正则 location(如 ~ ^/t/(?<tenant>\w+)/api/(?<v>\d+)/(?<path>.*)$)实现变量捕获,rewrite + break 完成内部路径重写,proxy_pass 结尾斜杠控制路径裁剪,配合 proxy_set_header 透传原始上下文。

proxy_pass 本身不“动态处理”路径,它只是转发;真正的动态路径匹配与改写,靠的是 location 规则 + rewrite 指令协同完成。关键不是 proxy_pass 写得多复杂,而是 location 怎么匹配、rewrite 怎么裁剪、break 怎么收口。
正则 location 是动态匹配的前提
固定前缀(如 /api/)只能做静态剥离,要提取版本号、模块名、租户 ID 等变量,必须用带捕获组的正则 location:
- 用 ~ 或 ~* 开头,例如
location ~ ^/t/(?<tenant>\w+)/api/(?<v>v\d+)/(.*)$</v></tenant> - 命名捕获组(
(?<name>...)</name>)让后续 rewrite 可直接引用,比如$tenant、$v、$2 - proxy_pass 后不能带路径(如
http://svc/或http://svc/api),否则 Nginx 会报错:“invalid URL prefix”
rewrite + break 是动态改写的执行核心
rewrite 不是“重定向”,而是内部路径重写;加 break 才能确保改完立刻走 proxy_pass,不重新匹配 location:
安全更新和维护 CLI Proxy API(CPA)部署与配置。用于 CPA 镜像升级、配置变更、认证目录兼容修复、上线验证与回滚。适用于用户提到“CPA 更新/升级/配置改了/容器重建/回滚”等场景。
- 路径必须以 / 开头,否则会被当成相对路径拼接,导致 404 或多斜杠
- 示例:
rewrite ^/t/\w+/api/(?<v>v\d+)/(.*)$ /$v/$2 break;</v>→ 请求/t/abc/api/v2/users变成/v2/users - 不用 last:它会触发新一轮 location 匹配,容易循环或跳到错误块
proxy_pass 的结尾斜杠决定是否自动裁剪
当不使用 rewrite 时,proxy_pass 末尾斜杠就是路径裁剪开关:
-
proxy_pass http://backend/;→ 自动去掉 location 匹配部分,只传剩余路径 -
proxy_pass http://backend;→ 原样转发完整请求路径(含匹配前缀) -
proxy_pass http://backend/api;→ 非法配置,Nginx 启动失败(结尾无 / 且带路径)
配套 header 设置让后端感知真实意图
路径改写后,后端常需知道原始请求上下文,尤其涉及跳转、鉴权或日志归因:
-
proxy_set_header X-Original-URI $request_uri;—— 透传浏览器发来的完整 URI -
proxy_set_header X-Forwarded-Prefix /t/$tenant/api/$v;—— 传递逻辑前缀供后端路由识别 -
proxy_set_header Host $host;和X-Real-IP保持基础代理语义

















