技术博文 · 2023-04-15 0

解决nginx 301跳转url最后带/问题

背景

公司官网通过几个工程组合合成,官网首页+产品文档。官网首页XXX.com域名强制301跳转到www.XXX.com。此时产品文档页加到首页后会受301跳转影响,所有url后面都会接上/号。导致文档内容内部跳转时出现路径错误问题。

问题解析

  • Nginx 服务中配置指令 absolute_redirect 用来配置重定向的方式。默认开启,为绝对重定向,url最后会加上/;否则为相对重定向。
  • 当我们访问URI时;如果访问资源为一个目录,并且URI没有以正斜杠(/)结尾;Nginx 服务就会返回一个301跳转,目标地址就是要加一个正斜杠。
  • 在跳转过程中 server_name_in_redirect 指令设置跳转目标的域名,默认配置为on ,从请求的 header 中获取。否则从配置文件中的 server_name 中获取。
  • 在跳转过程中 port_in_redirect指令设置跳转目录的端口,默认值为on,从 nginx 配置文件中的Listen端口获取。否则从接受到的请求头信息(header)中获取;如果是 Nginx 版本号大于 1.11.8,可以考虑用 absolute_redirect off;
  • 在单层 nginx 下,响应的 协议/域名/IP/端口 等,与请求一致。
    在双层 nginx 下,当第一层 nginx 修改 协议/域名/IP/端口 后,转发至第二层 nginx 处理。
    第二层 nginx 响应的 301 跳转地址,是基于被修改后的请求的,而第一层 nginx 不会修改这个 301 响应,原样输出到客户端后,造成访问失败。

解决方案

在server块中添加 absolute_redirect off;即可解决,最后不要忘记了重新加载配置文件。

最简单的方案:修改 absolute_redirect 指令为 off ,但要小心相对 Location 的兼容性。
最合理的方案:修改访问 http://example.com/path 地址为直接访问 http://example.com/path/ 地址,避免触发 301 跳转,减少一次网络请求。
有缺陷的方案:修改 try_files 指令内容为以下内容。但会造成 html 页面中用 相对路径 引用的静态资源失效。

try_files $uri $uri/index.html /index.html;

参考资料

Nginx 访问子目录时,不加/出现301重定向的问题

关于Nginx请求URL自动添加斜杠/的端口问题

双层 nginx 转发下的 try_files 指令 301 返回错误的 location 地址

Nginx URL后面不加斜杠301重定向