為什麼nginx「return 301」和「try_files」陷入無限循環

為什麼nginx「return 301」和「try_files」陷入無限循環

我的配置代碼:

index index.html index.php;
location / {
    if ($uri = '/a/') {
        return 301 https://example.com/a;
    }
    try_files $uri $uri/ =404; 
}

如果url是/a/,301到/a,然後try_files部分,添加//a末尾,成為/a/

下一步,我認為它將嘗試index定義,成為/a/index.html,並到達文件。

但實際上,它嘗試了/a/,跳出location,然後再次進入location,到if ($uri = '/a/') { ... }

然後無限循環。

為什麼,我只是感到困惑。


我想做的是

  1. 如果請求example.com/a/,跳到example.com/a,然後跳到 2
  2. 如果請求example.com/a,則顯示example.com/a/index.html(但 url 是example.com/a)。

有人可以幫助我實現這個目標嗎?

答案1

它正在做它應該做的事情。

你永遠無法到達,/a/index.html因為你不斷重定向回到/a這可能發生之前。當 nginx 處理這個問題時,它會看到檔案系統上的目錄並自動(正確)重定向到/a/.

您應該刪除這個不適當的重定向。

答案2

歡迎來到伺服器故障。您可以使用以下程式碼執行OP中提到的操作...

location / {
    if ($uri = '/a/') {
        return 301 https://example.com/a;
    }
    try_files $uri $uri/index.html =404; 
}

請參閱相關問題與接受的答案使用 nginx 刪除 URL 尾部斜杠

基本上,我們不必依賴index,而是在有請求index.html時直接提供服務。example.com/a

相關內容