Nginx:重定向 URL 以始終包含區域設定前綴

Nginx:重定向 URL 以始終包含區域設定前綴

我正在嘗試使用 nginx 和重定向規則來實現一些目標,這看起來應該非常簡單,但我遇到了絆腳石。

瀏覽了許多問題和答案後,我似乎找不到適合我的解決方案。

我想要實現的目標如下:

如果有人使用以下任一 URL 導覽到我的網站:

http://mywebsite.com
http://mywebsite.com/
http://mywebsite.com/foo

該人將被重新導向至:

http://mywebsite.com/en/
http://mywebsite.com/en/
http://mywebsite.com/en/foo/

到目前為止,這是我的 nginx 設定檔中的內容,按照檔案中的順序排列:

location ^/en/(.*) {
    try_files $uri /index.php$is_args$args last;
}

location / {
    if ( $uri !~ ^/(index\.php|css|jpg|png|images|core|uploads|js|robots\.txt|favicon\.ico) ) {
        return 301 /en/$uri;
    }
}

然而,透過上述配置,我遇到了無限重定向循環,並且在伺服器放棄之前地址欄中的 URL 最終像這樣:

http://mywebsite.com/en//en/en/en/en/en/en/en/en/en/en/en/en/en/en/en/en/en/en/en/

有人可以嗎:

a) 向我解釋為什麼我的配置沒有達到預期的效果,以便我能夠理解它並且將來不會重複相同的錯誤

b)提出一個可行的解決方案,如果可能的話改進我的配置

c) 如果可能,請進一步舉例說明如何讓 nginx 自動確定與請求關聯的區域設置,並動態轉換請求以按照上述方式包含它。

謝謝

答案1

向我解釋為什麼我的配置沒有達到預期的效果,以便我能夠理解它並且將來不會重複相同的錯誤

location ^/en/(.*)不是有效的指令。

您可能對 感到困惑location ^~ /en/(.*)。這匹配以任何內容開頭的任何查詢/en/

實際上,請求總是與location /指令匹配,這樣它就會讓你陷入無限循環。

提出一個可行的解決方案,如果可能的話改進我的配置

只需在指令中使用 Path 前綴location

location /en/ {
   try_files $uri $uri/ =404;
}

location / {
   return 301 /en$uri;
}

相關內容