人気が高まっている新しい正規表現ベースの回答に対処したいと思います。
location ~ ^/en(/?)(.*)$ { # OOPS!
proxy_pass http://luscious/$2$is_args$args; # OOPS!
}
一見するとこのソリューションはよりキュートに見えるかもしれませんが、いくつかの理由で間違っています。
上記の正規表現は、リクエストuriに一致し、/enjoyそれを/joyアップストリームにリダイレクトします。これは本当に意図したものですか?
のリクエストは/enリダイレクトを発生させず/、アップストリームから直接サービスを提供します(/en/代わりにリクエストが行われたかのように見えますが、完全ではありません)。ルートページのアップストリーム内で相対URIを使用する場合(そうでない場合/en/、アップストリームURI内に接頭辞がないのはなぜですか)、たとえばsrc="style.css"(言語固有の参照url("menu.png")など)、ブラウザはそれを要求しますの/style.css代わりに/en/style.css。(または、どこでも絶対URIを使用している場合でも、誰かが曖昧なセミオプションリソースを比較的参照している場合はどうでしょうか?)おっと、サイトが機能しないことがあります。
私ごととしてすでにOP自身の答えで述べた別の質問では、以前のアドバイス正規表現を使用して、防止proxy_redirectのデフォルト値を持っていることからディレクティブをdefaultにそれを下げて、off代わりに。これは、アップストリームがLocation: http://127.0.0.1:8080/en/dir/リクエスト/en/dirが行われたときに応答する場合、それがクライアントに表示されることを意味し、明らかに正しく動作しません。(/enそもそも正規表現の使用を促す要求に対しては特に皮肉なことでしたが、この特定の実装は、すでに前述したように別の問題に苦しんでいます。)さらに、既に使用している場合upstream特に、複数のアップストリームサーバーがある場合は、カスタムサーバーを使用しようとすると、余分なextraいものになる可能性がありますproxy_redirect。内proxy_redirectで正規表現を使用して、おそらく任意のホストに一致させることもできますが、将来クロスドメインリダイレクトを行うことにした場合はどうなりますか?
単一の正規表現ベースの場所で上記のポイントのいくつかに対処するために、次のことができます(より簡単にするためにproxy_pass、upstream-basedディレクティブからサーバーへの参照も削除する必要があることに注意してくださいproxy_redirect):
location ~ ^/en/?((?<=/).*)?$ {
location = /en { return 302 /en/; }
proxy_pass http://127.0.0.1:8080/$1$is_args$args;
proxy_redirect http://127.0.0.1:8080/ /en/;
}
したがって、私に尋ねると、2つの兄弟の最上位の場所を持つ元の解決策は、代わりに正規表現のルートをたどってウサギの穴に掘るよりも良いアイデアです。