proxy_pass在复杂路由中关键在于uri映射、location匹配及与正则、重写、upstream的协作;结尾斜杠决定路径替换行为,正则location中proxy_pass不可带uri,需配合rewrite;需显式设置请求头以透传host、ip等信息。

proxy_pass 在复杂路由场景下不是靠“加不加斜杠”就能搞定的,关键在于理解它如何处理 URI 映射、location 匹配逻辑,以及和正则、重写、上游组之间的协作关系。用错一个字符,请求路径就可能被拼错或丢失。
proxy_pass 后 URL 结尾斜杠决定路径替换行为
这是最常踩坑的一点,本质是 Nginx 对匹配路径的“截取+拼接”规则:
- location /api/ { proxy_pass http://backend/; } → 客户端访问 /api/v1/user,转发为 http://backend/v1/user(/api/ 被完全剥离)
- location /api/ { proxy_pass http://backend; } → 同样访问 /api/v1/user,转发为 http://backend/api/v1/user(原始路径原样保留)
- location /old/ { proxy_pass http://new/service/; } → 访问 /old/data → 转发到 http://new/service/data
- location /old/ { proxy_pass http://new/service; } → 访问 /old/data → 转发到 http://new/servicedata(注意:中间没斜杠,自动粘连)
正则 location 中 proxy_pass 不能带 URI
只要 location 用了 ~、~* 或 ^~,proxy_pass 后面就不能写路径部分,否则配置会直接报错:
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- ✅ 正确:
location ~ ^/v2/(.*)$ { proxy_pass http://api-v2; } - ❌ 错误:
location ~ ^/v2/(.*)$ { proxy_pass http://api-v2/; }(Nginx 启动失败) - ✅ 替代方案:用
rewrite配合break或last实现路径改写,再 proxy_pass 到无路径地址
结合 upstream 和负载均衡做动态路由
复杂场景往往需要把不同路径分发到不同集群,这时 upstream 不只是备用列表,而是路由策略的载体:
- 定义多个 upstream 块,比如
upstream auth_svc { server 10.0.1.10:8001; }、upstream order_svc { server 10.0.1.20:8002; } - 用精确或前缀 location 分流:
location = /login { proxy_pass http://auth_svc; }、location /order/ { proxy_pass http://order_svc/; } - 支持健康检查、权重、backup 等参数,让路由具备容错和灰度能力
需要透传或改写请求头时必须显式配置
proxy_pass 默认不传递原始 Host,也不保留客户端真实 IP,复杂路由下这些信息往往影响后端鉴权或日志追踪:
-
proxy_set_header Host $host;(或$http_host,保留端口和协议) proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;- 若后端依赖原始路径做权限判断,还需
proxy_set_header X-Original-URI $request_uri;
不复杂但容易忽略










