nginx 默认用 upstream 地址覆盖原始 host 头,需配置 proxy_set_header host $http_host; 并补充 x-forwarded-* 等头字段,确保后端获取真实域名、协议、ip 和端口信息。

后端拿不到真实域名,根本不是 Nginx “丢了” Host 头,而是它默认用 upstream 地址(比如 127.0.0.1:3000)重写了 Host 字段,把客户端发来的原始域名(如 app.example.com)给覆盖掉了。只要在 Nginx 配置里主动透传原始 Host,并补全相关上下文头,问题就能解决。
正确配置 Host 透传
在对应 location 或 server 块中添加以下任一指令(推荐第一种):
-
proxy_set_header Host $http_host;——完整保留客户端发送的 Host 值,含端口(如app.example.com:443),最贴近真实请求 -
proxy_set_header Host $host;——只传域名,不含端口;适用于标准 HTTP(80)/HTTPS(443)场景
务必检查并删除类似 proxy_set_header Host $proxy_host; 或硬编码 proxy_set_header Host example.com; 的错误配置,它们会强制覆盖原始值。
同步补充关键转发头
光修 Host 不够,尤其当后端要生成跳转链接、绝对 URL 或校验来源时:
-
proxy_set_header X-Forwarded-Proto $scheme;——告诉后端当前是 http 还是 https,避免跳转协议错乱 -
proxy_set_header X-Forwarded-Host $http_host;——提供原始 Host 全貌,供后端安全还原访问入口 -
proxy_set_header X-Real-IP $remote_addr;和proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;——辅助日志与风控,部分登录逻辑依赖 IP 来源
处理多级代理或非标端口场景
如果流量经过 CDN → Nginx → 后端,或 Nginx 终止 HTTPS 但后端走 HTTP + 非标端口(如 8080),需额外注意:
- 首层 Nginx 补充:
proxy_set_header X-Forwarded-Port $server_port; - 中间层继承:
proxy_set_header X-Forwarded-Port $http_x_forwarded_port; - 禁用自动重写:
proxy_redirect off;(不要留空或设为 default)
后端需主动读取这些头来构造跳转地址,否则响应中的 Location 仍可能指向内网地址或丢失端口。
验证是否生效
修改配置后执行 nginx -t 检查语法,再 nginx -s reload 生效。可在后端打印 Host、X-Forwarded-Host、X-Forwarded-Proto 等字段确认值是否符合预期。若仍不对,重点排查是否有多个 Nginx 层漏配,或上游设备(如 CDN、WAF)已篡改了 Host 头。











