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;

這樣就不會做跳轉了。也許也不是一個好辦法,但是浪費了太多時間,也不想管了。大概能用就好。