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.

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


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

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.