nginx przepisuje adres URL z parametrami

16

Mam adres URL tego typu:

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

I chcę go przekierować do tego:

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

Wypróbowałem więc tę regułę przepisywania bez powodzenia:

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

Czy nginx nie jest w stanie poradzić sobie z parametrami zapytania?

EDYCJA: Nie chcę przepisywać wszystkich petycji. Muszę tylko przepisać ten adres URL, bez wpływu na inne.

David Morales
źródło

Odpowiedzi:

15

Ok, dzięki początkowej pomocy rzaba, przedefiniowałem jego zasadę do tego działającego rozwiązania:

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

Właśnie dodałem warunek, aby uniknąć nieskończonej rekurencji i? na końcu reguły, aby pozbyć się początkowych parametrów . Działa idealnie :)

David Morales
źródło
1
Ciąg zapytania pozwala na inną kolejność parametrów. Więc ifprzestaniesz działać, gdy np. param2Przejdzie wcześniej param1.
Alexander Azarov,
Ciekawy. W moim przypadku tak się nie stanie, ponieważ jest to klikalny adres e-mail, ale dobrze wiedzieć. Dzięki.
David Morales,
4
lokalizacja = / {
  przepisać ^ http://www.example.com/newparam/$arg_param3/$arg_param4;
}
rzab
źródło
Więc muszę napisać $ arg_, a następnie nazwę parametru?
David Morales
Tak, to byłoby najłatwiejsze.
Martin Fjordvald
Ok, ale nie chcę przepisywać wszystkich petycji. Muszę tylko przepisać ten adres URL, bez wpływu na inne.
David Morales,
Zrobiłem kilka testów. Ta reguła wygeneruje nieskończone przekierowanie. Napiszę nową odpowiedź z kodem, który zabrałem do pracy. Dzięki :)
David Morales,
Powinienem chyba wspomnieć, że musisz zadeklarować „location /” oprócz „location = /”, aby uniknąć rekurencji. Myślę, że będziesz musiał to gdzieś jako proxy_pass jako główną trasę. „lokalizacja = /” odpowiada dokładnie / żądaniom. W każdym razie dopasowanie $ args wydaje się w porządku, z wyjątkiem tego, że dopasuje każde żądanie z parametrami? Param1 = val1 & ....
rzab