proxy_redirect的作用是改写后端响应中的重定向地址(location和refresh头),防止用户跳转到内网地址或错误路径;它不修改请求,仅重写301/302等重定向响应头中的url,需与proxy_pass同在location块中配置,支持绝对路径、相对路径及正则匹配。

proxy_redirect 的作用不是改请求,而是改响应——专门处理后端返回的重定向地址(Location 和 Refresh 响应头),避免用户被跳转到内网地址或错误路径。
proxy_redirect 的基本用法
当后端服务返回 301/302 重定向时,它写的 Location 地址通常是自己视角下的路径,比如 http://192.168.1.100:8080/login 或 /dashboard。Nginx 默认会原样透传,导致浏览器访问失败或路径错乱。proxy_redirect 就是用来重写这些地址的。
- 语法格式:
proxy_redirect [旧地址] [新地址]; - 支持正则匹配和变量,例如:
proxy_redirect ~^http://[^/]+(/.*)$ $scheme://$host$1; - 若只写一个参数(如
proxy_redirect / /app/;),表示把响应头中以/开头的 Location 全部替换成/app/
常见重写场景与配置
实际中最常遇到两类问题:内网地址暴露、相对路径跳转错位。
安全更新和维护 CLI Proxy API(CPA)部署与配置。用于 CPA 镜像升级、配置变更、认证目录兼容修复、上线验证与回滚。适用于用户提到“CPA 更新/升级/配置改了/容器重建/回滚”等场景。
- 后端返回绝对地址(如
Location: http://192.168.1.100:8080/home)→ 改成公网域名:proxy_redirect http://192.168.1.100:8080/ https://api.example.com/; - 后端返回根路径重定向(如
Location: /login)→ 补上前缀适配代理上下文:proxy_redirect / /v1/;(把/login变成/v1/login) - 后端返回协议无关路径(
Location: //example.com/next)→ 用正则统一补全:proxy_redirect ~^//(.*)$ $scheme://$host/$1;
配合 proxy_pass 使用的关键细节
proxy_redirect 不是独立生效的,它依赖 proxy_pass 的上下文,且默认只作用于当前 location 块。
- 必须和 proxy_pass 在同一 location 内配置,否则不生效
- 如果 proxy_pass 用了变量(如
http://$upstream),proxy_redirect 中的旧地址不能依赖具体 host,建议用相对路径或正则方式匹配 - 启用
proxy_redirect default;可自动将后端返回的Location: /xxx映射为当前请求的 scheme + host + /xxx(但仅限简单场景) - 调试时可在后端打印
X-Real-URI和响应头,确认原始 Location 内容,再针对性写规则
容易忽略的陷阱
看似简单,但几个配置疏漏会导致重定向失效:
- proxy_redirect 写在了 server 块顶层,没放在 location 内 → 不生效
- 旧地址写错了协议或端口(比如后端实际返回
https://,却配了http://)→ 匹配不上 - 用了
proxy_redirect off;却忘了它会禁用所有重定向改写(包括 default 规则) - 后端返回的是 307/308 这类“保持方法”的重定向,proxy_redirect 同样适用,无需额外设置










