Nginx默认用upstream地址重写Host头导致后端获取错误域名,需在location块中配置proxy_set_header Host $host或$http_host透传原始域名,并同步设置X-Real-IP和X-Forwarded-For以保障真实IP与Host一致。

这个问题本质是 Nginx 默认不透传原始 Host 头,后端应用直接读取 Host 请求头时拿到的是反代目标地址(比如 127.0.0.1:8080),而非用户真实访问的域名。只要在 proxy 配置中显式设置 Host 头即可修复。
必须添加 Host 请求头透传
Nginx 的 proxy_pass 不会自动保留客户端原始 Host,它默认把 Host 设为 upstream 地址(如 127.0.0.1)。后端若依赖 Host 做跳转、路由或安全校验,就会出错。
- 在
location块中加入:proxy_set_header Host $host; - 更稳妥写法(兼容无 Host 头的请求):
proxy_set_header Host $http_host; - 避免用
$server_name或硬编码,否则多域名场景会失效
配合 X-Forwarded-For 和 X-Real-IP 防止 IP 丢失
Host 错误常和 IP 识别异常共存。只设 Host 不够,后端获取真实客户端 IP 也会变成 127.0.0.1。
- 加上这两行,确保后端能拿到真实来源:
proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - 如果用了 Cloudflare 或多层代理,
X-Forwarded-For会带多个 IP,后端需取第一个非 unknown 的值
后端代码要适配代理头
即使 Nginx 设置正确,后端若仍调用 request.getRemoteAddr(),拿的还是 Nginx 的连接 IP(即 127.0.0.1)。
- Java 示例:优先读
X-Forwarded-For,再 fallback 到X-Real-IP,最后才是getRemoteAddr() - Spring Boot 可配
server.forward-headers-strategy=framework自动解析 - Node.js(Express)可用
req.ip或req.headers['x-forwarded-for'],需开启trust proxy
验证是否生效
改完配置别忘了 reload,并用简单方式确认:
- curl -H "Host: example.com" http://your-nginx-domain/ —— 看后端日志中 Host 是否为
example.com - 打印所有请求头(如 Nginx 的
log_format加$http_host和$http_x_forwarded_for) - 检查重定向 Location 响应头是否已不再出现
127.0.0.1


















