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.