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;

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