nginx反向代理中会自动修改或删除部分http头部:host被重写、逐跳头部(connection等)被移除、server等响应头被屏蔽;可通过proxy_set_header等指令透传x-real-ip、x-forwarded-for等真实信息,并需特殊配置支持websocket。

Nginx 在反向代理中不会简单地原样转发 HTTP 头部,而是有选择地修改、添加、透传或屏蔽部分字段,以确保后端服务能正确识别客户端意图,同时避免安全风险或协议冲突。
哪些头部会被自动移除或重写
Nginx 默认会清理或覆盖一些与代理场景不兼容的请求头,例如:
-
Host:除非显式用
proxy_set_header Host $host;保留,否则 Nginx 会将其替换为proxy_pass指令中指定的目标地址(如 upstream 名或 IP) - Connection、Keep-Alive、Upgrade、Transfer-Encoding:这些逐跳(hop-by-hop)头部默认被删除,防止干扰后端连接管理
-
Server、Date、X-Pad、X-Accel-*:响应头中这些字段默认不传递给客户端,需用
proxy_pass_header显式开启
如何传递客户端真实信息
后端常需知道原始访问者身份,Nginx 提供标准方式补充关键头部:
-
proxy_set_header X-Real-IP $remote_addr;:填入发起请求的客户端真实 IP(非代理 IP) -
proxy_set_header X-Forwarded-For $remote_addr;:若有多层代理,可追加为$http_x_forwarded_for, $remote_addr形成链式记录 -
proxy_set_header Host $host;或$http_host;:确保后端收到原始域名,用于多租户或虚拟主机识别 -
proxy_set_header X-Forwarded-Proto $scheme;:让后端知晓原始是 http 还是 https,避免重定向循环
如何控制头部的透传与屏蔽
根据安全策略或后端要求,可精细干预头部流转:
- 用
proxy_hide_header X-Frame-Options;屏蔽后端返回的特定响应头,防止前端被嵌套 - 用
proxy_pass_header X-Custom-Resp;主动透传某个原本被过滤的响应头 - 用
proxy_set_header Accept-Encoding "";清空请求头中的压缩标识,避免后端误判客户端能力 - 若某请求头值为空字符串(如
proxy_set_header Authorization "";),该头部将被完全移除
WebSocket 和 HTTP/1.1 场景的特殊处理
启用 WebSocket 或长连接时,头部行为需额外配置:
- 必须设置
proxy_http_version 1.1;,因 HTTP/1.0 不支持持久连接和升级机制 - 需显式透传
Upgrade和Connection头:proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "upgrade"; - 否则 Nginx 会按普通 HTTP 流程关闭连接,导致 WebSocket 握手失败











