réécriture nginx pour une URL avec des paramètres

16

J'ai une URL de ce type:

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

Et je veux le rediriger vers celui-ci:

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

J'ai donc essayé cette règle de réécriture sans succès:

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

Nginx n'est-il pas capable de gérer les paramètres de requête?

EDIT: Je ne veux pas réécrire toutes les pétitions. Je n'ai qu'à réécrire cette URL, sans affecter les autres.

David Morales
la source

Réponses:

15

Ok, grâce à l'aide initiale de rzab, j'ai redéfini sa règle à cette solution de travail:

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

Je viens d'ajouter une condition pour éviter une récursion infinie, et un? à la fin de la règle pour se débarrasser des paramètres initiaux . Cela fonctionne parfaitement :)

David Morales
la source
1
La chaîne de requête permet un ordre différent de paramètres. Ainsi, vous ifcesserez de fonctionner lorsque par exemple param2va avant param1.
Alexander Azarov
Intéressant. Dans mon cas, cela ne se produira pas car il s'agit d'une URL cliquable dans un e-mail, mais c'est bon à savoir. Merci.
David Morales
4
emplacement = / {
  réécrire ^ http://www.example.com/newparam/$arg_param3/$arg_param4;
}
rzab
la source
Alors, dois-je écrire $ arg_ puis le nom du paramètre?
David Morales
Oui, ce serait le plus simple.
Martin Fjordvald
D'accord, mais je ne veux pas réécrire toutes les pétitions. Je n'ai qu'à réécrire cette URL, sans affecter les autres.
David Morales
J'ai fait quelques tests. Cette règle va générer une redirection infinie. J'écrirai une nouvelle réponse avec le code que j'ai mis au travail. Merci :)
David Morales
Je devrais probablement mentionner que vous devez déclarer "location /" en plus de "location = /" pour éviter la récursivité. Je suppose que vous l'aurez à proxy_pass quelque part comme route principale. "location = /" correspond exactement à / demandes. Quoi qu'il en soit, la correspondance de $ args semble correcte, sauf qu'elle correspondra à toute demande avec les paramètres? Param1 = val1 & ....
rzab