我正在嘗試使用 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;
}