Nginx通过proxy.ru中转代理接口遇重定向问题求助
问题分析与修正方案
你的核心问题在于原配置没有正确传递请求路径,且未处理后端返回的重定向响应,导致浏览器地址栏跳转。以下是修正后的完整配置及关键说明:
修正后的site1.ru Nginx配置
location /api/ { # 正确传递/api路径到proxy.ru,确保请求路径匹配site2.ru的API proxy_pass http://proxy.ru/api/; # 告诉proxy.ru目标后端是site2.ru proxy_set_header Host site2.ru; # 传递客户端真实IP和协议信息,避免后端因协议不匹配返回错误重定向 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; # 拦截后端返回的重定向响应,自动替换Location中的site2.ru为site1.ru proxy_redirect https://site2.ru/ https://site1.ru/; proxy_redirect http://site2.ru/ https://site1.ru/; # 可选:如果后端响应内容中存在硬编码的site2.ru链接,自动替换为site1.ru sub_filter 'site2.ru' 'site1.ru'; sub_filter_once off; }
关键配置说明
路径传递修正
原配置中proxy_pass http://proxy.ru;会将https://site1.ru/api/xxx转发为http://proxy.ru/xxx,丢失了/api前缀,导致proxy.ru或site2.ru可能因路径不匹配返回重定向。加上/api/后,请求路径会完整传递为http://proxy.ru/api/xxx,与site2.ru的API路径对齐。重定向拦截处理
当site2.ru返回301/302重定向时,响应头的Location字段会包含site2.ru域名,proxy_redirect指令会自动将该字段中的域名替换为site1.ru,确保浏览器跳转时地址栏保持site1.ru。响应内容替换(可选)
如果后端API返回的JSON、HTML等内容中存在硬编码的site2.ru链接,sub_filter会全局替换为site1.ru,避免用户点击后跳转到目标站点。需要注意:使用该功能需确保Nginx编译时包含http_sub_module模块(大部分发行版默认包含)。
补充:proxy.ru的配套配置(若需)
如果proxy.ru本身需要配置反向代理到site2.ru,可参考以下示例:
location /api/ { proxy_pass https://site2.ru/api/; proxy_set_header Host site2.ru; 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; }
内容的提问来源于stack exchange,提问作者Efobo
相关产品推荐
相关产品推荐

