为什么反向代理总是丢 Host 头
2026-10-19
后端拿到的 Host 变成了上游地址,或者干脆是空的,然后签名校验、白名单、跳转全部错乱。这个问题在换代理软件的时候特别容易撞上。
默认行为不一样
不带配置时,大多数反代会把 Host 改写成上游的主机名;也有的会直接保留原始值。行为取决于具体实现和版本,不能想当然。
显式写死是最稳的:
# nginx
proxy_set_header Host $host;
# Caddy
reverse_proxy 127.0.0.1:3080 {
header_up Host {host}
}
端口也会被吃掉
$host 不含端口,$http_host 含端口。如果后端要做完整的地址拼接(比如生成回调 URL),用 $http_host,否则 8080 之类的端口会凭空消失。
多层代理
两跳以上时,第一跳的 X-Forwarded-For 会被后续跳追加而不是覆盖。取真实客户端 IP 要取最左边那个,并且只信任已知代理的地址段,不然可以被伪造。
一句话总结
不要依赖反代的默认值。想把 Host 原样传给后端,就明确写出来,然后抓一次包确认。省下的排查时间远超那两行配置。