根本原因是nginx默认用upstream地址(如127.0.0.1:3000)重写host头,覆盖客户端原始域名(如app.example.com);修复需在location/server块中配置proxy_set_header host $http_host或$host,并补充x-forwarded-proto、x-real-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 生效。验证时重点关注:
- 用
curl -v http://your-domain.com查看发起请求的 Host 值 - 在后端打印全部请求头(如
console.log(req.headers)),确认host字段是否为预期域名 - 检查是否有多个
proxy_set_header Host出现在嵌套块中,后定义的会覆盖前一个 - 若自定义 header 含下划线(如
gray_origin),需在http块顶部加underscores_in_headers on;,并显式透传











