megrxu

記一個奇怪的 301 跳轉

應該是一個星期之前出現的問題了,一直沒時間記。今天記一下下。

前戲

由於之前的騰訊雲伺服器被自己搞的很髒,所以就重置了一下。

重新配伺服器的時候,懶得配證書,也懶得用 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.xuguorui.xyz {
    proxy / http://localhost:10001 {
    }
}

但是這個時候出現了一個問題。一旦訪問 https://blog.xuguorui.xyz/categories 這個url就會跳轉到 http://localhost:10001/categories/ 去。

問題解決

一開始認為是Caddy Server的問題,所以仔細去看proxy的文件,但是似乎沒有什麼發現,胡亂了例子中的預設也沒有什麼作用。況且例子中的proxy就是一樣寫的,所以感覺出問題的可能性比較小。

使用Chrome查看了到底是怎麼跳轉的,發現是在訪問 https://blog.xuguorui.xyz/categories 的時候有一個301跳轉,跳到了http://localhost:10001/categories/

現在才開始懷疑是自己的nginx沒有配好。進而發現訪問 https://blog.xuguorui.xyz/categories/ 就沒有問題。

終於注意到了是有沒有 / 的問題。所以一切都是在 nginx 的 try_files 那裡。

如果nginx認為請求的url指向的是一個目錄而不是一個檔案,為了保證url的一致,他會做一個跳轉,到加上了 / 的url,這個時候由於是nginx作出的,所以caddy不再管了,在這裡看來就是去了localhost:10001。

具體解決的話,我直接把try_files改成了這樣:

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

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