web-dev-qa-db-ja.com

Nginx:常にロケールプレフィックスを含むようにURLをリダイレクトします

私はnginxとリダイレクトルールで何かを達成しようとしていますが、それはかなり簡単なはずですが、つまずきに遭遇しました。

多くの質問と回答を調べましたが、自分に合った解決策が見つからないようです。

私が達成したいのは次のとおりです。

誰かが次のURLのいずれかを使用して私のWebサイトに移動した場合:

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にリクエストに関連付けられたロケールを自動的に決定し、上記の方法でリクエストを含めるように動的に変換する方法を例を挙げて説明します。

ありがとう

3
newbie

私の構成が意図した効果をもたらさなかった理由を説明してください。そうすれば、理解でき、将来同じエラーを繰り返さないようになります。

location ^/en/(.*)は有効なディレクティブではありません。

location ^~ /en/(.*)と混同されている可能性があります。これは、/en/で始まりその後に何かが続くすべてのクエリに一致します。

実際、リクエストは常にlocation /ディレクティブと一致するため、無限ループに陥ります。

動作するソリューションを提案し、可能であれば構成を改善します

locationディレクティブ内でPathプレフィックスを使用するだけです。

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

location / {
   return 301 /en$uri;
}
4
krisFR