https重定向配置核心是保持客户端视图与后端处理逻辑一致;需显式指定非标端口跳转、用proxy_redirect重写location头、设置port_in_redirect或absolute_redirect、正确传递host和x-forwarded-proto头,并统一proxy_pass结尾斜杠。

HTTPS 重定向配置中做端口转发,核心是让客户端看到的地址(协议、域名、端口)和后端实际处理的地址保持逻辑一致,否则容易出现跳转错乱、混合内容、证书警告或接口 302 失败等问题。关键不在“能不能转”,而在于“转完之后浏览器看到的是什么”。
非标准 HTTPS 端口(如 8443、2083)的跳转必须显式声明
当 Nginx 监听非 443 的 HTTPS 端口(比如 listen 8443 ssl),用户用 HTTP 访问时,不能只靠 return 301 https://$host$request_uri——因为默认会跳转到 https://domain.com:8443/,但浏览器可能不信任该端口上的证书,或服务未监听该端口。
- 正确做法:在 HTTP server 块中,明确指定目标端口:
return 301 https://$host:8443$request_uri; - 更稳妥方式:用
error_page 497捕获“HTTP 请求发到了 HTTPS 端口”的错误,并重定向到带端口的 HTTPS 地址:error_page 497 =301 https://$host:8443$request_uri;
后端返回 Location 头时,协议与端口需被 Nginx 重写
如果后端应用(如 Spring Boot、Tomcat)做了重定向(例如返回 Location: http://example.com/login 或 Location: //example.com/api),而 Nginx 是 HTTPS 入口、后端是 HTTP,那么浏览器会收到错误的跳转地址。
- 用
proxy_redirect改写响应头中的 Location:proxy_redirect http://example.com/ https://example.com/;
或更通用:proxy_redirect http:// /;(把所有 http:// 开头的 Location 替换为当前请求协议+主机) - 若后端使用相对路径重定向(如
Location: /admin),Nginx 默认会拼接自己的$scheme://$host:$port;此时若 Nginx 运行在非标准端口(如 8443),但对外暴露的是 443,则需关闭端口透传:port_in_redirect off;(适用于旧版 Nginx)
或absolute_redirect off;(Nginx ≥ 1.11.8,推荐)
Host 头传递必须包含端口(仅当 Nginx 和后端端口不一致时)
当 Nginx 监听 443,后端监听 8080;或 Nginx 监听 8443,后端监听 8081 —— 后端若依赖 Host 头生成绝对 URL(如邮件链接、OAuth 回调地址),就可能出错。
- 应设置:
proxy_set_header Host $host:$server_port;
而不是只写$host,确保后端知道原始请求端口 - 同时建议补全:
proxy_set_header X-Forwarded-Proto $scheme;
让后端能准确判断是否为 HTTPS 请求,避免生成 http:// 链接
代理路径末尾斜杠影响 URI 映射,易引发 404 或重复路径
location 中 proxy_pass 的 URI 结尾是否带 /,直接决定路径拼接逻辑:
-
location /api/ { proxy_pass http://backend:8080/; }→/api/user转发为http://backend:8080/user -
location /api/ { proxy_pass http://backend:8080; }→/api/user转发为http://backend:8080/api/user(多数后端不期望此路径) - 务必统一结尾斜杠:proxy_pass 后加
/,且 location pattern 也以/结尾,避免歧义











