proxy_set_header 指令用于重写请求头,需与 proxy_pass 同在 location 块中生效;可覆盖 Host、透传 X-Real-IP/X-Forwarded-For、设置 X-Forwarded-Proto,并支持变量动态构造头字段,但须避免全局配置及注意自动清理的头部。

proxy_pass 本身不重写请求头,它只负责把请求转发给后端。真正实现请求头重写的,是 proxy_set_header 指令。这个指令必须和 proxy_pass 配合使用,写在同一个 location 块里,才能生效。
基础用法:覆盖或添加标准请求头
最常见的是设置 Host、真实 IP 和协议信息:
FastAPI + Flask 混合部署最佳实践,解决路由定义、API 代理等常见问题,适用于同时运行 FastAPI API 与 Flask 前端的场景。
-
Host 头重写:后端服务常依赖 Host 判断租户或路由,但 Nginx 默认转发的是客户端的 Host。用
proxy_set_header Host $host;可保留原始 Host;若需强制指定,可写成proxy_set_header Host backend.example.com; -
真实客户端 IP 传递:Nginx 作为代理时,后端看到的 remote_addr 是 Nginx 自己的 IP。加上
proxy_set_header X-Real-IP $remote_addr;和proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;,就能把真实 IP 透传过去 -
协议与安全标识:前端走 HTTPS,后端可能跑在 HTTP 上,需告知后端真实协议:
proxy_set_header X-Forwarded-Proto $scheme;
进阶技巧:动态构造请求头值
proxy_set_header 支持变量拼接,适合做条件化注入:
- 把路径前缀带入请求头:
proxy_set_header X-Api-Context /api/;或用变量proxy_set_header X-Path-Prefix $uri; - 根据域名区分环境:
proxy_set_header X-Env $server_name;(如 dev.example.com → “dev.example.com”) - 添加自定义追踪 ID:
proxy_set_header X-Request-ID $request_id;(需启用random_index on;或使用第三方模块生成)
关键注意事项
这些细节不注意,请求头可能被忽略或覆盖:
- 如果上游服务器也用了 proxy_set_header,且未显式声明某头字段,Nginx 会继承其默认值(比如 Host 默认为 $proxy_host),所以必须显式写出要控制的头
- 不要在 server 级别全局写 proxy_set_header,除非所有 location 都需要相同行为;否则应在具体 location 内配置,避免误传
- 某些头(如 Connection、Keep-Alive)会被 Nginx 自动清理,无法通过 proxy_set_header 强制保留
- 调试时可加一行:
proxy_set_header X-Debug-URI $request_uri;,后端打印该 header 即可确认 Nginx 实际发出的完整路径和参数

















