Nginx

Nginx:重定向 URL 以始終包含語言環境前綴

  • June 16, 2015

我正在嘗試使用 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 自動確定與請求關聯的語言環境並動態轉換請求以按照上述方式包含它。

謝謝

向我解釋為什麼我的配置沒有達到預期的效果,這樣我就可以理解它並且以後不會重複同樣的錯誤

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

你可能對location ^~ /en/(.*). 這匹配任何以任何開頭的查詢/en/

實際上,請求總是匹配location /指令,這樣它就會把你帶入一個無限循環。

提出一個可行的解決方案,並在可能的情況下改進我的配置

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

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

location / {
  return 301 /en$uri;
}

引用自:https://serverfault.com/questions/698922