1 、这个情况是不是腾讯云造成的?(就不同服务端对这类情况处理不同)
答:是腾讯云造成的,nginx 使用的 301 跳转方法更合理一些。
2 、如果相对路径有没有办法对应这个问题?
答:没有,这实际上是腾讯云的处理导致页面的目录结构被错误理解了。
3 、我能想到的方法是在 index.html 里判断一下当前路径,不行加个跳转。有没有更好的方法?
答:我暂时能想到的也只有这个方法了。
接下来说一下具体为什么会出现这个情况,首先来看 nginx 的实现。
当你访问
abc.com/proj/ 的时候,nginx 知道你想要访问的是 proj 这个『子目录』,
于是 nginx 会去 proj 目录,按照配置好的 index 文件名(一般是 index.html )去寻找相应的文件。
当找到了 proj/index.html 后,会将它作为 proj 这个『子目录』的『主页』返回给浏览器。
当你访问
abc.com/proj 的时候(不带斜杠),nginx 会有点迷惑,你会不会是想找一个叫 proj 的『文件』呢?
于是 nginx 会先去看一下是否存在一个叫做 proj 的『文件』,看了看好像并没有这个『文件』;
那么善解人意的 nginx 就会想到,你肯定是想访问 /proj/ 这个 『子目录』;
于是 nginx 返回了一个 301 重定向,将你带去
abc.com/proj/ 访问(带斜杠)。
再接下来,就是上面的流程了。
// nginx 的这个功能,可以通过 absolute_redirect 参数来进行开关。
腾讯云的 COS 的实现问题在于,当你访问
abc.com/proj 的时候(不带斜杠),善解人意的腾讯云,也猜到了你其实是想访问 /proj/ 这个 『子目录』,但是它做了一个愚蠢的决定,那就是直接将 proj/index.html 的内容返回给你。
这让死脑筋的浏览器犯了迷糊,既然我访问
abc.com/proj 时得到了一个页面,那看来这个页面应该是属于 proj 这个『文件』的,那么当前页面所在的『目录』应该就是
abc.com/ 了。
相关文档:
https://cloud.tencent.com/document/product/436/32670#.E7.B4.A2.E5.BC.95.E6.96.87.E6.A1.A3想要解决这个问题,就需要在访问
abc.com/proj 的时候,有个明确的重定向机制(也就是 nginx 做的 301 ),这样浏览器能够明确的区分出当前页面所在的目录。
写到这里,我想到一个方法不知道是否可行,可以试试创建一个 proj 『文件』,在里面写上手动重定向的代码,但是我不确定腾讯云的 COS 是否能正确的处理 MIME 信息。(可能需要使用自定义 Headers 功能自定义一下)