私は 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 でリクエストに関連付けられたロケールを自動的に判別し、上記の方法でそれを含めるようにリクエストを動的に変換するにはどうすればよいですか? 例を挙げて説明してください。
ありがとう
答え1
私の設定が意図した効果をもたらさなかった理由を説明してください。そうすれば、理解して、将来同じエラーを繰り返さないようにすることができます。
location ^/en/(.*)
有効なディレクティブではありません。
と混同されている可能性がありますlocation ^~ /en/(.*)
。これは、 で始まり、その後に何かが続くすべてのクエリと一致します/en/
。
実際、リクエストは常にlocation /
ディレクティブと一致するため、無限ループが発生します。
機能するソリューションを提案し、可能であれば構成を改善してください
ディレクティブ内で Path プレフィックスを使用するだけですlocation
:
location /en/ {
try_files $uri $uri/ =404;
}
location / {
return 301 /en$uri;
}