Nginx Rewrite für eine URL mit Parametern

16

Ich habe eine URL dieses Typs:

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

Und ich möchte es auf dieses umleiten:

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

Daher habe ich diese Umschreiberegel ohne Erfolg ausprobiert:

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

Kann nginx nicht mit Abfrageparametern umgehen?

EDIT: Ich möchte nicht alle Petitionen umschreiben. Ich muss nur diese URL umschreiben, ohne die anderen zu beeinflussen.

David Morales
quelle

Antworten:

15

Ok, dank der anfänglichen Hilfe von rzab habe ich seine Regel für diese funktionierende Lösung neu definiert:

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

Ich habe gerade eine Bedingung hinzugefügt, um eine unendliche Rekursion zu vermeiden, und ein? am ende der regel die initialen params loswerden . Es funktioniert perfekt :)

David Morales
quelle
1
Abfragezeichenfolge ermöglicht eine andere Reihenfolge der Parameter. So werden Sie ifaufhören zu arbeiten, wenn zB param2vorher geht param1.
Alexander Azarov
Interessant. In meinem Fall wird es nicht auftreten, weil es eine anklickbare URL in einer E-Mail ist, aber es ist gut zu wissen. Vielen Dank.
David Morales
4
location = / {
  umschreiben ^ http://www.example.com/newparam/$arg_param3/$arg_param4;
}
rzab
quelle
Muss ich also $ arg_ und dann den Parameternamen schreiben?
David Morales
Ja, das wäre am einfachsten.
Martin Fjordvald
Ok, aber ich möchte nicht alle Petitionen umschreiben. Ich muss nur diese URL umschreiben, ohne die anderen zu beeinflussen.
David Morales
Ich habe einige Tests gemacht. Diese Regel generiert eine unendliche Umleitung. Ich werde eine neue Antwort mit dem Code schreiben, den ich zur Arbeit bekommen habe. Danke :)
David Morales
Ich sollte wahrscheinlich erwähnen, dass Sie "location /" neben "location = /" angeben müssen, um eine Rekursion zu vermeiden. Ich denke, Sie müssen es irgendwo als Hauptroute proxy_pass haben. "location = /" entspricht genau / Anfragen. Jedenfalls scheint es in Ordnung zu sein , $ args abzugleichen, es sei denn, es wird jede Anfrage mit den Parametern abgeglichen? Param1 = val1 & ....
rzab