パラメーター付きのURLのnginxの書き換え


16

このタイプのURLがあります:

http://www.example.com/?param1=val1&param2=&param3=val3&param4=val4&param5=val5

そして、私はこれをこれにリダイレクトしたい:

http://www.example.com/newparam/val3/val4

だから私は成功せずにこの書き換えルールを試しました:

rewrite "/?param1=val1&param2=&param3=(.+)&param4=(.+)&param5=(.+)" http://www.example.com/newparam/$1/$2 redirect;

nginxはクエリパラメータを処理できませんか?

編集:すべての請願書を書き直したくありません。他の人に影響を与えることなく、そのURLを書き換えるだけです。

回答:


15

OK、rzabの最初の助けのおかげで、私は彼のルールをこの実用的なソリューションに再定義しました。

location / {
    if ($args ~* "/?param1=val1&param2=&param3=[0-9]+&param4=.+&param5=[0-9]+") {
        rewrite ^ http://www.example.com/newparam/$arg_param3/$arg_param4? last;
    }
}

無限再帰を回避するための条件を追加しましたか?ルールの最後で、最初のparamsを取り除きます。それは完璧に動作します:)


1
クエリ文字列では、パラメーターの順序を変えることができます。だから、if例えばparam2前に行くとあなたの仕事は止まりますparam1
アレクサンダーアザロフ

面白い。私の場合、それは電子メール内のクリック可能なURLなので発生しませんが、知っておくと良いでしょう。ありがとう。
デビッドモラレス

4
場所= / {
  書き換え^ http://www.example.com/newparam/$arg_param3/$arg_param4;
}

だから、私は$ arg_を書いてからパラメータ名を書く必要がありますか?
デビッドモラレス

はい、それが最も簡単です。
マーティンフィヨルドヴァルド

わかりましたが、すべての請願書を書き直したくありません。他の人に影響を与えることなく、そのURLを書き換えるだけです。
デビッドモラレス

私はいくつかのテストを行いました。そのルールは無限のリダイレクトを生成します。仕事に着いたコードで新しい答えを書きます。ありがとう:)
デビッドモラレス

おそらく、再帰を回避するために、「location = /」に加えて「location /」を宣言する必要があることに言及する必要があります。私はあなたがどこかをメインルートとしてproxy_passに持っていると思います。「location = /」は/リクエストと完全に一致します。それが一致するよ除いとにかく、$ argsは一致して、[OK]を思わ任意のパラメータで要求をのparam1 = val1と&....?
rzab
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.