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.

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


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

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.