proxy_redirect不支持正则,仅支持前缀匹配;可通过rewrite+map+proxy_redirect变量形式(Nginx≥1.19.0)实现多域名动态重定向映射,或降级用add_header覆盖Location头。

proxy_redirect 本身不支持正则表达式匹配,它只支持前缀匹配和固定字符串替换。但你可以通过 Nginx 的 rewrite 指令 + proxy_redirect 的组合方式,在反向代理响应头(Location、Refresh)中实现多域名的动态重定向地址映射。
理解 proxy_redirect 的作用范围
它仅改写后端返回的 Location 和 Refresh 响应头中的 URL,不处理请求路径或客户端跳转逻辑。例如后端返回 Location: http://old.com/path,你可用:proxy_redirect http://old.com/ https://new.com/;
将其改为 https://new.com/path。
但它不能写成:proxy_redirect ~^http://(.*?).example.com/(.*)$ https://$1.example.net/$2; —— 这是无效语法。
用 rewrite + proxy_redirect 实现多域名映射
核心思路:先用 rewrite 提取原始响应头中的域名和路径,再用 map 或嵌套 if(谨慎)做域名映射,最后通过 proxy_redirect 替换固定前缀。更推荐使用 map 配合变量构造目标前缀:
- 在
http块中定义域名映射关系:
map $upstream_http_location $mapped_location {
~^https?://(?<dom>[^/]+)\.old\.com(?<rest>/.*)$ https://$dom.new.com$rest;
~^https?://(?<dom>[^/]+)\.legacy\.org(?<rest>/.*)$ https://$dom.live.net$rest;
default $upstream_http_location;
}- 在 location 中启用 proxy_redirect 并引用变量(需 Nginx ≥ 1.19.0):
location /app/ {
proxy_pass https://backend/;
proxy_redirect off; # 关闭默认替换
proxy_redirect $upstream_http_location $mapped_location;
}注意:$upstream_http_location 是 Nginx 自动捕获的后端响应头值;$mapped_location 是 map 规则生成的目标 URL。
兼容旧版本 Nginx 的替代方案
若 Nginx 版本低于 1.19.0(不支持变量形式的 proxy_redirect),可改用 add_header Location ... 覆盖响应头(仅适用于简单场景,且会丢失原始状态码语义):
- 禁用自动重写:
proxy_redirect off; - 用 if 判断并覆盖 Location 头(慎用,if 在 location 中有局限):
if ($upstream_http_location ~ ^https?://([^/]+)\.old\.com(/.*)) {
add_header Location "https://$1.new.com$2" always;
return 302;
}⚠️ 不推荐在高并发生产环境频繁使用 if,优先升级 Nginx 或采用 map + proxy_redirect 变量方式。
调试与验证要点
- 开启
error_log /path/to/log debug;查看 proxy_redirect 是否命中及替换结果 - 用
curl -I请求接口,确认响应头中Location:是否已按预期变更 - 检查后端是否返回绝对 URL —— proxy_redirect 对相对路径无效
- 确保
proxy_set_header Host和proxy_redirect中的协议、域名、斜杠结尾严格一致(如http://a.com/≠http://a.com)


















