Nginx级联反向代理问题:请求跳转至内部IP而非公网域名
解决Nginx级联反向代理的重定向问题
问题核心
访问https://a.domain.com/server/db/时被重定向到内网IPhttp://1.2.3.4/db,本质是internal服务器返回的重定向头直接使用了自身内网地址,没有适配公网域名的路径前缀。
修复方案
1. 调整out服务器的Nginx配置
启用请求头传递,并添加proxy_redirect指令重写上游返回的重定向地址:
location /server/ { proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; # 将上游返回的内网地址重写为公网域名+路径前缀 proxy_redirect http://1.2.3.4/ /server/; # 末尾加/确保路径映射正确:/server/db/ → http://1.2.3.4/db/ proxy_pass http://1.2.3.4:80/; }
2. 可选优化:调整internal服务器配置
如果希望上游服务直接生成适配公网的重定向,可以给internal的Nginx添加Host头配置:
location /db/ { proxy_set_header Host a.domain.com; proxy_set_header X-Forwarded-Proto $scheme; proxy_pass http://db:port/; }
此步骤非必须,仅靠out服务器的proxy_redirect即可解决重定向问题。
关键原理
proxy_set_header Host $host:让上游服务器感知到公网域名,避免生成基于内网IP的链接。proxy_redirect:强制替换上游返回的Location头,把内网地址替换为用户可见的公网路径前缀。proxy_pass末尾的/:保证路径映射逻辑正确,避免出现路径拼接错误。
内容的提问来源于stack exchange,提问作者tilch
相关产品推荐
相关产品推荐

