proxy_pass 实现请求转发需依斜杠规则裁剪拼接uri:location / 转发全路径;/admin/ → http://.../ 时末尾/触发前缀剥离;正则匹配须用rewrite配合break;https透传需设x-forwarded-proto确保协议正确。

配置 proxy_pass 实现请求转发,核心在于理解它如何与 location 协同工作——不是简单“复制粘贴路径”,而是根据斜杠规则自动裁剪和拼接 URI。配错斜杠,后端收不到正确路径,常见 404 或 502 就由此而来。
基础转发:让 Nginx 当“传话筒”
最简场景:把所有请求原样转给一个后端服务。
-
location / { proxy_pass http://127.0.0.1:3000; }访问/api/users→ 转发到http://127.0.0.1:3000/api/users - 必须加
proxy_set_header系列,否则后端拿不到真实 IP 和协议: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;
路径重写:去掉或替换前缀
当浏览器访问 /admin/xxx,但后端只认 /xxx,就得靠斜杠控制裁剪逻辑。
FastAPI + Flask 混合部署最佳实践,解决路由定义、API 代理等常见问题,适用于同时运行 FastAPI API 与 Flask 前端的场景。
- 去前缀(推荐):
location /admin/ { proxy_pass http://127.0.0.1:8000/; }/admin/login→http://127.0.0.1:8000/login(末尾/触发剥离) - 补全路径:
location /v2/ { proxy_pass http://127.0.0.1:9000/api/v2/; }/v2/posts→http://127.0.0.1:9000/api/v2/posts - 错误示范:
location /admin/ { proxy_pass http://127.0.0.1:8000; }会把/admin/login转成http://127.0.0.1:8000/admin/login,后端通常不认
正则匹配:动态路径改写
当 location 用 ~ 或 ~* 正则时,proxy_pass 后不能带路径,否则 Nginx 直接报错。
- 必须配合
rewrite:location ~ ^/api/(?<ver>v\d+)/(.*)$ { rewrite ^/api/(?<ver>v\d+)/(.*)$ /$ver/$2 break; proxy_pass http://127.0.0.1:5000; }</ver></ver> -
break表示重写后不再匹配其他 location,直接走 proxy_pass - 不能写成
proxy_pass http://127.0.0.1:5000/api/,Nginx 会拒绝加载配置
HTTPS 透传与内网暴露
用 Nginx 把内网服务暴露到公网,重点在协议和头信息的“诚实转达”。
- SSL 终止后,务必设
X-Forwarded-Proto $scheme,否则后端生成的跳转链接可能是http://而非https:// - 确保 Nginx 能连通后端地址(如
192.168.1.100:8080),检查防火墙、路由、DNS - 若后端依赖
Host头(比如多租户 SaaS),用proxy_set_header Host $host;保留原始域名










