Nginx路径级反向代理核心是location匹配+proxy_pass斜杠控制:proxy_pass末尾带/则剥离location前缀(如/old/→/),不带/则保留完整路径;多路径需按最长前缀优先配置,辅以proxy_redirect和proxy_cookie_path适配重定向与Cookie路径。

把旧版系统路径透明代理到新版系统,核心是让客户端访问旧地址时,Nginx 在不改变 URL、不跳转、不暴露后端的情况下,把请求悄悄转发给新版服务,并原样返回响应。这属于典型的路径级反向代理,关键在 location 匹配 + proxy_pass 路径重写控制。
明确路径映射关系
先理清你要代理的具体路径,比如:
- 用户访问
https://example.com/old/api/v1/users→ 实际由新版服务http://new-api:8080/api/v1/users处理 - 用户访问
https://example.com/old/static/→ 转发到http://new-static:9000/
注意:proxy_pass 后的 URL 尾部斜杠(/)决定是否截断 location 前缀。这是最容易出错的地方。
基础配置示例(单路径代理)
假设旧路径以 /old/ 开头,新版 API 地址为 http://127.0.0.1:3000/,且新版服务期望接收不带 /old 前缀的请求:
location /old/ {
proxy_pass http://127.0.0.1:3000/; # 注意末尾有 /
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}说明:
– location /old/ 匹配所有以 /old/ 开头的请求
– proxy_pass http://.../ 末尾的 / 会把 /old/ 替换为空,例如 /old/api/list → 转发为 /api/list
– 若写成 proxy_pass http://127.0.0.1:3000;(无尾部 /),则完整路径会被拼接,变成 /old/api/list,通常不是你想要的
多路径或差异化代理
如果不同旧路径要映射到不同新版服务,可分别定义 location:
location /old/api/ {
proxy_pass http://new-backend:8080/; # 去掉 /old/api/,保留 /api/
}
location /old/static/ {
proxy_pass http://new-cdn:9000/; # 去掉 /old/static/,转发到 CDN 根
}
location /old/ {
proxy_pass http://legacy-fallback/; # 兜底:其他 /old/ 请求走老系统(可选)
}注意:location 匹配按最长前缀优先,所以 /old/api/ 会优先生效于 /old/。
保持 Cookie 和重定向兼容性
新版系统若生成 302 跳转或设置 Cookie 的 Path,可能因路径变化失效。需补充以下配置:
-
proxy_redirect off;—— 禁用 Nginx 自动改写响应头中的Location和Refresh - 如新版返回
Location: /api/login,而你希望客户端仍看到/old/api/login,可用:proxy_redirect /api/ /old/api/; - 若 Cookie 的
Path=/没问题;若设为Path=/old/,新版需改为Path=/或由 Nginx 用proxy_cookie_path重写:proxy_cookie_path /old/ /;


















