Nginx反向代理丢失请求头主因有三:下划线头被静默丢弃,需配置underscores_in_headers on;关键头如Host、Origin等未显式透传;自定义头须用proxy_set_header手动声明。

反向代理丢失请求头,不是后端没收到,而是 Nginx 在转发前就悄悄“过滤”或“忽略”了。问题往往不报错、不打日志,只让业务逻辑静默失败——比如自定义头 app_name、api_key_id 消失,或 Origin 校验失败返回 403。核心就三类配置错误,对症改就行。
下划线请求头被静默丢弃
Nginx 默认禁止含下划线(_)的请求头,像 app_name、user_token、TOKEN_HEADER 全部被丢,且不提示、不记录。这是最隐蔽也最高频的问题。
- 必须在
http{}或server{}块中启用:underscores_in_headers on; - 不能写在
location里,否则无效 - 若有多层 Nginx(如 CDN → 边缘 Nginx → 网关),每一层都要配
关键请求头未显式透传
Nginx 不会自动把原始请求头全发给上游。Host、X-Real-IP、Origin 这些都得手动用 proxy_set_header 补上,否则后端看到的是 Nginx 自己的 IP 或空 Origin。
- 基础必传项:
proxy_set_header Host $host;(别用$http_host,它可能带端口) - 真实客户端 IP:
proxy_set_header X-Real-IP $remote_addr;和proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - Origin 头要原样转发:
proxy_set_header Origin $http_origin;(尤其跨域调试时)
自定义头未单独声明
即使启用了 underscores_in_headers on,Nginx 也不会自动转发所有自定义头。比如前端带了 Authorization、API-Key 或 X-App-Version,必须显式映射。
- 格式统一为:
proxy_set_header Header-Name $http_header_name;(横杠转小写+下划线) - 例如:
proxy_set_header Authorization $http_authorization; - 例如:
proxy_set_header X-App-Version $http_x_app_version; - 注意大小写:HTTP 头名不区分大小写,但 Nginx 变量名必须小写加下划线
其他易漏细节
有些问题看着像头丢失,其实是配置逻辑冲突:
-
ignore_invalid_headers off;:当头名含冒号、空格等非法字符时,可临时放开(不推荐长期开启) - 多级代理时,
X-Forwarded-For要用$proxy_add_x_forwarded_for而非$remote_addr,否则链路中断 - 修改配置后务必执行
nginx -t && nginx -s reload,仅 reload 不校验语法


















