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.