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.

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 :)


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;
}

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.