目录

Nginx 301重定向问题

起因

发现在直接点击「文章」、「标签」等顶部跳转栏时,会无法访问资源

https://cdn.jsdelivr.net/gh/Oasis7311/halfstack_image@main/blog/202307130858896.png

而直接点击某个文章是可以的

排查

F12查看了具体的网络请求后发现,点击文章时,浏览器访问的地址是:

https://halfstack.net/zh-ch/posts

然后服务器远端为:68.178.202.89:443

响应码为301,重定向为:

http://halfstack.net:8080/zh-ch/posts/

https://cdn.jsdelivr.net/gh/Oasis7311/halfstack_image@main/blog/202307130902225.png

直接curl访问重定向地址后响应是:

https://cdn.jsdelivr.net/gh/Oasis7311/halfstack_image@main/blog/202307130903681.png

看起来是因为不允许8080端口使用HTTP/0.9访问

这和nginx的配置相符:只监听http2请求https://cdn.jsdelivr.net/gh/Oasis7311/halfstack_image@main/blog/202307130906858.png

根因

Nginx在响应时,针对子目录的情况下:

  1. 假如访问的是:host.com/file

    那么实际上是访问file文件

  2. 假如访问的是:host.com/file/

    那么实际上访问的是file文件夹

请求文件夹时,对于一个典型配置的服务器,处理流程如下:

  1. 判断此文件夹是否存在,不存在返回 404
  2. 判断此文件夹下是否有默认文件,例如 index.html 若有则返回。
  3. 否则返回 404。

而请求文件,则是:

  1. 判断文件是否存在,存在则返回。
  2. 否则返回 404。

特殊情况

如果请求被执行下面任意一个操作:

如果此时请求路径不包含结尾斜杠,那么服务器将直接返回 301 永久重定向,跳转到带斜杠的路径:/user -301--> /user/

我的问题就出在这里,当返回301时,同时还带上了端口号8080,且协议更改为了HTTP/0.9,不是很明白为什么301的目的地址是这个,可能是因为nginx默认的一些兜底跳转逻辑导致的(处理请求的是8080端口 + 直接重定向为http协议)

解决

发现问题之后就好解决了,三种方法

  1. 8080端口支持http/0.9访问,但是这样的话https还有什么意义呢?
  2. 原本的情况是跳转至8080端口,且协议为http。直接通过配置文件,301重定向至https,且加上末尾的斜杠,由监听443端口的xray重新fallback回8080访问对应文件夹。
  3. 通过nginx的location配置,将halfstack.net/posts等单独配置返回对应的文件夹资源,而不是重定向到新的地址

https://cdn.jsdelivr.net/gh/Oasis7311/halfstack_image@main/blog/202307130933134.png