web-dev-qa-db-fra.com

Pourquoi $ args ou $ query_string n'inclut-il pas les paramètres de requête après &?

J'essaye de mettre en place une règle de réécriture nginx pour modifier l'URL avec la requête de requête.

Par exemple.:

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

devrait être réécrit pour:

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

J'essaie d'utiliser la variable $args ou $query_string (sur la base de la documentation nginx, ils sont identiques) pour vérifier si l'URL a une requête de requête. Mais j'ai trouvé $args (ou $query_string) n'a que le contenu avant &.

Dans mon exemple, cela signifie $args = paraA=10. Je ne peux pas obtenir le contenu des paramètres après &. Je le détermine via le journal des erreurs nginx avec le niveau défini pour déboguer.

Aucune idée pourquoi je ne peux pas obtenir les paramètres de requête après & dans la variable $args ou $query_string?

4
buddha

Vous devez utiliser $arg_<argname>

www.abc.com/pathA/pathB/script.pl?paraA=10&paraB=20 sera réécrit sur: www.abc.com/pathA/pathB/script.pl.1020

Voici un exemple de configuration pour faire une telle chose

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

Le problème n'est pas causé par le fichier de configuration nginx. Cela est dû au fait que j'oublie les guillemets doubles lorsque j'ai envoyé une demande à l'aide de curl. Par exemple: curl "www.abc.com/pathA/pathB/script.pl?paraA=10&paraB=20" Sans guillemet double, "& paraB = 20" ne sera jamais envoyé réellement.

5
buddha