proxy_redirect指令用于重写后端返回的location和refresh响应头,防止301/302跳转暴露内网地址或路径错位,仅在含proxy_pass的location中生效,支持字面量替换、路径前缀补全及正则动态适配,并需配合proxy_set_header传递x-forwarded-proto等头确保后端生成正确跳转地址。

在 Nginx 的 location 块中修改后端返回的响应头(如 Location、Refresh),核心是用 proxy_redirect 指令重写跳转地址,而不是“劫持”——Nginx 不允许任意篡改任意响应头,但对重定向类头部有原生支持。
用 proxy_redirect 修正 301/302 的 Location 头
后端返回的 Location: http://localhost:8080/login 这类地址,浏览器会直接跳转,暴露内网或路径错位。必须在 location 块中配置重写规则:
-
基础替换:把后端原始域名/端口替换成当前请求的协议+域名
proxy_redirect http://localhost:8080/ /; -
补全路径前缀:若代理路径为
/v2/,但后端返回/api/user,应改为/v2/api/userproxy_redirect / /v2/;(注意末尾斜杠表示“以 / 开头的路径全部替换”) -
动态适配(推荐):匹配任意 HTTP 协议的 Location,并转为当前协议+域名
proxy_redirect ~^http://[^/]+(/.*)$ $scheme://$host$1;
配合 proxy_set_header 防止后端生成错误 Location
很多框架(如 Spring Boot)会根据请求头自动生成跳转地址。若不传正确头,后端可能输出 http:// 而非 https://:
-
proxy_set_header X-Forwarded-Proto $scheme;—— 让后端知道当前是 HTTPS -
proxy_set_header Host $host;—— 避免后端误读 Host 为内部地址 -
proxy_set_header X-Forwarded-Prefix /v2;—— 显式告知子路径前缀(需后端主动读取)
验证是否生效的实操方法
别只看配置,要验证实际响应:
- 用
curl -I https://your-domain.com/path查看返回的Location:是否已变成预期地址 - 开启 debug 日志:
error_log /var/log/nginx/error.log debug;,搜索proxy_redirect关键字确认重写是否触发 - 若仍跳转失败,检查是否遗漏
proxy_redirect或规则顺序错误(它只对当前location生效)
不能直接修改其他响应头的说明
Nginx 原生不支持在 location 中修改任意响应头(如 Content-Type 或自定义头)。如需注入 CORS 头,用 add_header;如需改写 Set-Cookie 的 Domain/Path,需启用 proxy_cookie_domain 和 proxy_cookie_path 指令,而非通用响应头劫持。











