根本解法是配置absolute_redirect off和port_in_redirect off,使nginx返回相对路径重定向(如location: /admin/),由浏览器自动补全完整url并保留宿主机端口,避免因容器内端口与映射端口不一致导致跳转失败。

当 Nginx 运行在 Docker 容器中,或直接监听非 80/443 端口(如 8080、9279)时,访问像 /admin 这样的路径,Nginx 常会自动补尾部斜杠并发起 301 重定向到 /admin/。但默认行为下,它生成的 Location 响应头可能丢失宿主机端口(变成 http://example.com/admin/),或错误带上容器内端口(如 :80),导致浏览器跳转失败。根本解法是关闭绝对重定向,改用相对路径。
absolute_redirect off:强制使用相对路径重定向
该指令让 Nginx 在返回 301/302 响应时,Location 头只写路径本身(如 /admin/),不拼协议、域名和端口。浏览器会自动基于当前 URL 上下文补全完整地址,自然保留用户实际访问的端口(如 :9279)。
- 必须放在具体的
server块内,不能写在http或全局上下文 - 推荐搭配
server_name明确匹配,例如server_name example.com;或server_name "";(匹配空 Host) - 适用于所有由 Nginx 自身触发的重定向:目录自动补 /、
rewrite ... redirect、return 301等
port_in_redirect off:避免 Nginx 主动插入端口
即使关了 absolute_redirect,若 port_in_redirect 仍为 on(默认),Nginx 在某些场景下仍可能往 Location 中硬加端口(尤其是非标准端口被识别为“需显式写出”时)。设为 off 可彻底阻止这一行为。
- 与
absolute_redirect off通常成对出现,两者协同确保路径干净 - 不影响反向代理场景;它只作用于 Nginx 自身生成的重定向响应
- 注意:此设置不改变
$server_port变量值,仅控制是否输出到响应头
验证是否生效的简单方法
用 curl -I 检查真实响应头最直接:
- 请求
curl -I http://localhost:9279/admin - 正常情况应看到
Location: /admin/(纯路径,无协议无端口) - 若仍看到
Location: http://...或含错误端口(如:80),说明配置未加载或未命中对应 server 块 - 修改后别忘了
nginx -t && nginx -s reload
补充说明:静态文件 alias 场景也适用
当使用 alias 指令映射静态目录(如 location /static/ { alias /app/assets/; }),Nginx 对末尾缺失斜杠的请求(如 /static/css)也会重定向。这类重定向同样受 absolute_redirect 控制。只要在同个 server 块中开启 off,就能避免因端口错位导致的 404。











