应关闭 absolute_redirect 和 port_in_redirect:在 server 块中配置 absolute_redirect off; port_in_redirect off; 并确保 server_name 正确匹配,使重定向返回纯相对路径(如 /login),由浏览器自动补全当前上下文。

当 Nginx 运行在非 80/443 端口(比如 8080、8000)且后端服务返回相对路径重定向(如 302 /login)时,Nginx 默认会将其补全为带端口的绝对 URL(如 http://example.com:8080/login)。这容易导致前端无法正确解析、CDN 缓存异常或浏览器同源策略拦截。解决核心是让重定向保持相对路径,交由浏览器自动补全当前上下文。
关闭 absolute_redirect 强制使用相对重定向
这是最直接有效的做法。Nginx 默认开启 absolute_redirect on,会用请求中的 $scheme、$host 和 $server_port 拼接完整跳转地址。设为 off 后,所有由 return 302 /path 或 rewrite ... redirect 生成的 Location 响应头将原样输出 /path,不添加协议、域名或端口。
- 在对应
server块中添加:absolute_redirect off; - 必须确保该
server块能实际匹配到请求,例如明确配置server_name example.com;或使用server_name "";匹配空 Host 头 - 该指令作用于
http、server、location上下文,推荐放在server级别统一控制
配套关闭 port_in_redirect 防止端口硬编码
即使 absolute_redirect off 已启用,若它仍为 on,Nginx 在某些内部重定向逻辑中仍可能插入端口(尤其在 proxy_pass 后端返回 301/302 时)。因此建议同步关闭:
- 添加
port_in_redirect off;到同一server块中 - 该设置仅影响 Nginx 主动构造的绝对重定向中的端口部分,与
absolute_redirect off协同,彻底剥离端口干扰 - 无需担心丢失端口:浏览器收到
Location: /next后,会自动沿用当前页面的协议、域名和端口发起新请求
验证是否生效的简单方法
修改配置后重载 Nginx(nginx -s reload),用 curl 测试重定向响应头:
- 发起一个会触发跳转的请求,例如:
curl -I http://localhost:8080/auth - 观察响应头中的
Location字段:成功时应为Location: /login(无协议、无域名、无端口) - 若仍是
Location: http://localhost:8080/login,检查是否遗漏server_name匹配,或配置未加载到实际生效的server块
注意 rewrite 和 return 的行为差异
absolute_redirect off 只影响相对路径的自动补全,对显式写出的绝对 URL 无效:
-
return 302 /dashboard;→ 受控,输出Location: /dashboard -
return 302 https://api.example.com/v1;→ 不受影响,原样输出完整地址 -
rewrite ^/old(.*)$ /new$1 redirect;→ 受控,输出Location: /new... -
rewrite ^/old(.*)$ https://example.com/new$1 redirect;→ 不受影响











