一、功能说明
proxy_redirect 是 Nginx 反向代理中用于修改后端返回的响应头中 Location 和 Refresh 字段的核心指令,主要解决以下问题:
- 协议/地址透传错误:当后端返回的 Location 包含内部 IP、HTTP 协议或非标准端口时,需修正为客户端可访问的域名和协议。
- 端口一致性:避免因代理层与后端端口不一致导致的重定向地址错误(如外部访问 80/443 端口,内部服务使用其他端口)。
- 安全与规范:隐藏后端服务器真实信息,防止暴露内部架构细节。
二、配置语法
proxy_redirect default | off | redirect replacement;
- default:根据 proxy_pass 和 location 自动推导替换规则(默认模式)
- off:禁用所有重定向修正,透传原始响应头
- redirect replacement:手动定义替换规则,支持正则匹配
三、典型场景与配置示例
场景 1:修正协议(HTTP → HTTPS)
- 后端返回 HTTP 地址,但客户端需 HTTPS 访问:
location / {proxy_pass http://backend_server;proxy_redirect http:// https://; # 全局替换协议
}
场景 2:替换 IP/端口
- 后端返回内网地址 http://192.168.1.10:8080,需替换为公网域名:
proxy_redirect http://192.168.1.10:8080/ https://$host/;
# 或使用正则匹配:
proxy_redirect ~^http://(\d+\.\d+\.\d+\.\d+):\d+/(.*) https://$host/$2;
场景 3:处理非标准端口
- 外部通过 443 访问,后端服务在 8888 端口:
proxy_redirect http://$host:8888/ https://$host/; # 替换端口
四、注意事项
- 协议透传联动:需配合 proxy_set_header 传递真实协议和主机信息:
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Proto $scheme; # 后端识别协议用
- 正则表达式用法:
~ 开启正则匹配(区分大小写)
~* 不区分大小写
proxy_redirect ~^(http://[^:]+):\d+/(.*) $scheme://$host/$2;
- 多级重定向处理:
proxy_intercept_errors on; # 拦截错误响应
error_page 302 = @handle_redirect; # 自定义重定向处理逻辑
location @handle_redirect {proxy_pass $upstream_http_location; # 代理层二次转发
}
- 死循环规避:避免同时在前端(Nginx)和后端配置跳转逻辑。
五、验证方法
使用 curl -I 检查响应头