背景
公司官网通过几个工程组合合成,官网首页+产品文档。官网首页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 转发下的 try_files 指令 301 返回错误的 location 地址