Nginx反向代理中传递自定义请求头需用proxy_set_header显式设置,注意默认不透传、变量命名规则(如$http_authorization)、underscores_in_headers开启及map实现动态头部,配置后须验证生效。

在 Nginx 反向代理中传递自定义请求头部,核心是使用 proxy_set_header 指令显式设置,并注意默认丢弃行为和变量引用方式。Nginx 不会自动透传所有客户端头(比如 Host、Authorization、带下划线的头等),必须手动声明。
基础写法:用 proxy_set_header 注入固定或动态值
在 location 块中配置 proxy_pass 后,每行写一个 proxy_set_header:
-
proxy_set_header X-Request-ID $request_id;—— 使用内置变量生成唯一 ID(需先启用random_index on;或配合map) -
proxy_set_header X-Domain $host;—— 传递当前访问的域名 -
proxy_set_header X-Proto $scheme;—— 标明是 http 还是 https -
proxy_set_header X-Custom-Tag "prod-v2";—— 固定字符串值,适合环境标识
透传原始客户端头(如 Authorization、User-Agent)
客户端发来的某些头不会自动转发,需显式“拉取”并设为请求头:
-
proxy_set_header Authorization $http_authorization;—— 注意变量名是$http_+ 小写+下划线格式 proxy_set_header User-Agent $http_user_agent;proxy_set_header Referer $http_referer;- 若客户端头含下划线(如
X-API_Key),需在http或server块加:underscores_in_headers on;
按域名/路径注入不同值(用 map 实现条件头部)
当需要根据请求来源动态设置头(例如多租户识别),推荐用 map 预定义变量:
- 在
http块顶部添加:
map $host $x_tenant_id {<br> default "unknown";<br> app-a.example.com "tenant-a";<br> app-b.example.com "tenant-b";<br>}
- 然后在
location中使用:proxy_set_header X-Tenant-ID $x_tenant_id; -
map支持正则、通配符和嵌套逻辑,比 if 更高效安全
常见陷阱与验证要点
配置后容易忽略但影响实际效果的关键点:
-
proxy_pass_request_headers on;必须开启(默认就是 on,但显式写上更稳妥) - 不要遗漏
proxy_set_header Host $host;,否则后端可能收不到正确 Host,导致路由失败或 HTTPS 重定向异常 - 修改配置后执行
nginx -t && nginx -s reload,避免语法错误导致服务中断 - 用
curl -v或浏览器开发者工具检查后端响应日志,确认头是否真实到达(比如 Node.js 中打印req.headers['x-tenant-id'])


















