Nginx 301重定向问题
目录
起因
发现在直接点击「文章」、「标签」等顶部跳转栏时,会无法访问资源
而直接点击某个文章是可以的
排查
F12查看了具体的网络请求后发现,点击文章时,浏览器访问的地址是:
https://halfstack.net/zh-ch/posts
然后服务器远端为:68.178.202.89:443
响应码为301,重定向为:
http://halfstack.net:8080/zh-ch/posts/
直接curl访问重定向地址后响应是:
看起来是因为不允许8080端口使用HTTP/0.9访问
这和nginx的配置相符:只监听http2请求
根因
Nginx在响应时,针对子目录的情况下:
-
假如访问的是:host.com/file
那么实际上是访问file文件
-
假如访问的是:host.com/file/
那么实际上访问的是file文件夹
请求文件夹时,对于一个典型配置的服务器,处理流程如下:
- 判断此文件夹是否存在,不存在返回 404
- 判断此文件夹下是否有默认文件,例如
index.html
若有则返回。 - 否则返回 404。
而请求文件,则是:
- 判断文件是否存在,存在则返回。
- 否则返回 404。
特殊情况
如果请求被执行下面任意一个操作:
如果此时请求路径不包含结尾斜杠,那么服务器将直接返回 301 永久重定向,跳转到带斜杠的路径:/user -301--> /user/
我的问题就出在这里,当返回301时,同时还带上了端口号8080,且协议更改为了HTTP/0.9,不是很明白为什么301的目的地址是这个,可能是因为nginx默认的一些兜底跳转逻辑导致的(处理请求的是8080端口 + 直接重定向为http协议)
解决
发现问题之后就好解决了,三种方法
- 8080端口支持http/0.9访问,但是这样的话https还有什么意义呢?
- 原本的情况是跳转至8080端口,且协议为http。直接通过配置文件,301重定向至https,且加上末尾的斜杠,由监听443端口的xray重新fallback回8080访问对应文件夹。
- 通过nginx的location配置,将halfstack.net/posts等单独配置返回对应的文件夹资源,而不是重定向到新的地址