web-dev-qa-db-ja.com

nginx rewriteはURLの最後にパラメータを追加します

次のパラメーターがURLの最後に追加されるようにリバースプロキシを構成する必要があります。_&locale=de-de_

これはほとんど機能します:

rewrite ^(.*)$ $1&locale=de-de break;

ただし、問題は、「&locale = de-de」がまだない場合にのみ追加する必要があるということですand「?」がある場合URLに...

これを行うための正しい正規表現の定式化についていくつかの助けを得ることができますか?

別の質問:これを使用すると、URLの疑問符が表示されないのはなぜですか。
$ uri?$ args

または、$ uri $ is_args $ argsはエンコードされていないURLを変換し、疑問符は%3fとして表示されます。

アイデア?

編集:この動作は、proxy_passと組み合わせて使用​​しているときに存在するようです。単純な書き直しでは、それは本当にうまくいきます。

13
Sascha
  1. rewriteでは、URLのpath部分のみと照合します。つまり、$1にはクエリ文字列は含まれません。
  2. デフォルトでは、Nginxは元のクエリ文字列をリライト置換に追加します。

だから、それは安全に書くべきです

rewrite ^(.*)$ $1?locale=de-de break;

Nginxに元のクエリ文字列を追加させたくない場合は、単に?置換URLの最後:

rewrite ^(.*)$ $1?locale=de-de? break;
15

rewriteはリクエストパラメータを変更せず、URIのパス部分のみを変更します。私の経験では、書き換えをいじると、奇妙なサイクルが発生し、新しいパラメータが無限に追加されます。 Nginxでこれを行う方法は、おそらく書き換えではありません。

代わりに、$argssetディレクティブを使用した変数:

set $args $args&locale=de-de;
3
Palimondo

rewriteの一致にはクエリパラメータが含まれていないため、別の場所でテストする必要があります。

試してください:

if ($args !~* locale=de\-de){
    rewrite ^(.*)$ $1&locale=de-de last;
}
3
Shane Madden