megrxu

记一个奇怪的 301 跳转

May 26, 2017  #Code #Web Server 

应该是一个星期之前出现的问题了,一直没时间记。今天记一下下。

前戏

由于之前的腾讯云服务器被自己搞的很脏,所以就重置了一下。

重新配服务器的时候,懒得配证书,也懒得用 Caddy Server 实现一些奇奇怪怪的功能,所以就打算使用 Nginx 在服务器搞一些本地的代理,然后使用 Cadddy Server 反代出去。这样子就不需要考虑 Caddy Server 的一些局限,又能很方便地配好证书了。

问题出现

对Hexo,使用 nginx serve static files,也就是 hexo g 出来的一堆文件,在 localhost:10001 运行,然后caddy做反代。

nginx 的配置文件:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
server {
  listen 10001;
  #listen [::]:10001 default_server;

  root /path/to/html/megrxu.github.io;
  index index.html index.htm index.nginx-debian.html;
  server_name localhost;

  location / {
    autoindex off;
    try_files $uri $uri/ =404;
                allow 127.0.0.1;
                deny all;
  }
}

可以看到,try_files 字段是为了解析可能是目录的一个url,如果存在这个文件则直接返回,如果不存在就当他是个目录,如过还不存在就返回404。

CaddyFile 更简单了:

1
2
3
4
blog.xugr.me {
    proxy / http://localhost:10001 {
    }
}

但是这个时候出现了一个问题。一旦访问 https://blog.xugr.me/categories 这个url就会跳转到 http://localhost:10001/categories/ 去。

问题解决

一开始认为是Caddy Server的问题,所以仔细去看proxy的文档,但是似乎没有什么发现,胡乱了例子中的预设也没有什么作用。况且例子中的proxy就是一样写的,所以感觉出问题的可能性比较小。

使用Chrome查看了到底是怎么跳转的,发现是在访问 https://blog.xugr.me/categories 的时候有一个301跳转,跳到了http://localhost:10001/categories/

现在才开始怀疑是自己的nginx没有配好。进而发现访问 https://blog.xugr.me/categories/ 就没有问题。

终于注意到了是有没有 / 的问题。所以一切都是在 nginx 的 try_files 那里。

如果nginx认为请求的url指向的是一个目录而不是一个文件,为了保证url的一致,他会做一个跳转,到加上了 / 的url,这个时候由于是nginx作出的,所以caddy不再管了,在这里看来就是去了localhost:10001。

具体解决的话,我直接把try_files改成了这样:

1
try_files $uri $uri/index.html =404;

这样就不会做跳转了。也许也不是一个好办法,但是浪费了太多时间,也不想管了。大概能用就好。