一、功能說明
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 檢查響應頭