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.