proxy_redirect专用于修正后端302跳转响应头中的Location和Refresh字段,将其内网地址重写为公网可访问URL,不修改请求、静态资源或响应体。
当后端服务运行在 Docker 容器中(比如
或
),它生成的 302 跳转响应头如
或
,直接透传给浏览器会导致跳转失败或暴露内网细节。Nginx 的
就是专为解决这类问题设计的——它不改请求,只修正响应头里的跳转地址,让客户端始终看到公网可访问的 URL。
明确
proxy
_redirect 的作用边界
只处理上游响应中的
和
头,和请求转发路径无关。它不替代
,也不影响静态资源或 API 数据体。只要后端返回了 301/302 响应,且其中含需重写的跳转地址,它就生效。
它不修改请求 URI,也不重写 body 内容
它不自动识别协议或域名,所有匹配都靠你显式定义(包括
、斜杠、端口)
规则按 location 块生效,多个 location 可配不同规则
根据后端返回类型选择匹配方式
先用
查看真实返回的
值,再决定怎么写规则:
Nginx
在宝塔面板中轻松管理Nginx高性能Web服务器。提供可视化配置反向代理、负载均衡、SSL证书及HTTP缓存功能,一键优化高并发性能,助您高效搭建稳定、快速的网站运行环境。
下载
若后端返回绝对地址,如
:
若后端返回相对路径,但 Nginx 配了子路径代理(如
),而跳转目标是
,实际应导向
:
若后端可能返回多种内网地址(不同容器 IP 或端口),用正则统一提取路径:
适配 HTTPS 和动态协议
用户通过 HTTPS 访问,但后端是 HTTP 容器,跳转地址必须保持协议一致。单纯写死
在 HTTP 站点会出错。稳妥做法是:
在 server 块中加:
后端应用读取该 header 构造跳转地址(推荐);此时 Nginx 可简化为:
(即把内网前缀替换成相对路径,由浏览器基于当前页面协议+域名补全)
若后端无法改造,且确定只走 HTTPS,直接写死目标协议更直观可靠
验证与排错关键点
规则不生效,90% 是因为前后缀不完全匹配:
检查斜杠:`http://host/` 和 `http://host` 不等价,末尾斜杠必须一致
检查协议:`http://` 和 `https://` 是不同字符串,不能混用
开启调试日志:
重启后看日志是否打印 “proxy redirect” 相关 rewrite 行为
确认规则位置:必须写在包含
的
块内,不能只放在
或
块顶层
172.18.0.5:8080localhost:3000Location: http://localhost:3000/dashboardLocation: /loginproxy_redirectproxy_redirectLocationRefreshproxy_passhttp://curl -I https://your-domain.com/loginLocationLocation: http://172.18.0.5:8080/callbackproxy_redirect http://172.18.0.5:8080/ https://your-domain.com/;location /api/ { proxy_pass http://backend/; }/dashboard/api/dashboardproxy_redirect / /api/;proxy_redirect ~^http://[^/]+(?::\d+)?/(.*)$ https://your-domain.com/$1;https://proxy_set_header X-Forwarded-Proto $scheme;proxy_redirect http://172.18.0.5:8080/ /;error_log /var/log/nginx/error.log info;proxy_passlocationserverhttp