web-dev-qa-db-ja.com

$ argsまたは$ query_stringに&の後にクエリパラメータが含まれないのはなぜですか?

クエリリクエストでURLを変更するnginx書き換えルールを設定しようとしています。

例えば。:

www.abc.com/pathA/pathB/script.pl?paraA=10&paraB=20

次のように書き換える必要があります。

www.abc.com/pathA/pathB/script.pl.1020

変数$argsまたは$query_string(同じnginxのドキュメントに基づく)を使用して、URLにクエリリクエストがあるかどうかを確認しようとしています。しかし、$args(または$query_string)には&より前のコンテンツしか含まれていないことがわかりました。

私の例では、$args = paraA=10を意味します。 &の後にパラメーターの内容を取得できません。これは、デバッグに設定されたレベルのnginxエラーログで確認します。

変数&または$args$query_stringの後にクエリパラメータを取得できない理由はありますか?

4
buddha

$arg_<argname>を使用する必要があります

www.abc.com/pathA/pathB/script.pl?paraA=10&paraB=20は、www.abc.com/pathA/pathB/script.pl.1020に書き換えられます。

以下はそのようなことをするためのサンプル設定です

location /pathA/pathB/script.pl {
    set $need_redirect "";
    if ($arg_paraA) {
       set $need_redirect "A";
    }

    if ($arg_paraB) {
       set $need_redirect "B$need_redirect";
    }

    if ($need_redirect = "BA") {
       rewrite ^(.*)$ $1.$arg_paraA$arg_paraB;
    }
}
7
Tarun Lalwani

問題の原因はnginx構成ファイルではありません。 curlを使用してリクエストを送信したときに二重引用符を忘れたことが原因です。例:curl "www.abc.com/pathA/pathB/script.pl?paraA=10&paraB=20"二重引用符がないと、 "&paraB = 20"は実際には送信されません。

5
buddha