nginx przepisać dołącza parametr na końcu adresu URL

13

Muszę skonfigurować mój zwrotny serwer proxy, aby na końcu adresu URL dodano następujący parametr: &locale=de-de

To prawie działa:

rewrite ^(.*)$ $1&locale=de-de break;

Problem polega jednak na tym, że muszę dołączyć „& locale = de-de” tylko wtedy, gdy go jeszcze nie ma i jeśli jest „?” w adresie URL ...

Czy mogę uzyskać pomoc w sformułowaniu poprawnego wyrażenia regularnego, aby to zrobić?

Kolejne pytanie: Dlaczego znak zapytania w moim adresie URL nie jest wyświetlany, jeśli używam tego:
$ uri? $ Args

Lub $ uri $ is_args $ args tłumaczy adres URL niezakodowany, a znak zapytania jest wyświetlany jako% 3f.

Pomysły?

EDYCJA: Wygląda na to, że takie zachowanie istnieje podczas używania w połączeniu z proxy_pass. W prostym przepisaniu działa naprawdę dobrze.

Sascha
źródło

Odpowiedzi:

15
  1. W rewritedopasowaniu tylko do części ścieżki URL . Co oznacza, $1że nie będzie zawierać ciągu zapytania.
  2. Domyślnie Nginx dołącza oryginalny ciąg zapytania do zastępowania przepisywania.

Tak więc pisanie powinno być bezpieczne

rewrite ^(.*)$ $1?locale=de-de break;

W przypadku, gdy nie chcesz, aby Nginx dołączał oryginalny ciąg zapytania, po prostu podaj ?na końcu zastępczego adresu URL:

rewrite ^(.*)$ $1?locale=de-de? break;
Aleksander Azarow
źródło
Dziękuję Ci! Nie widziałem, że próbowałem to zrobić w niewłaściwy sposób.
Sascha
A + to najlepsza odpowiedź
Dziękuję
3

Dopasowanie do rewritenie obejmuje parametrów zapytania, więc musisz to sprawdzić gdzie indziej.

Próbować:

if ($args !~* locale=de\-de){
    rewrite ^(.*)$ $1&locale=de-de last;
}
Shane Madden
źródło
1
„IfIsEvil”: wiki.nginx.org/IfIsEvil
Alexander
@Alexander Dobry punkt; to rewritemusi lastbyć bezpieczne. Edytowane.
Shane Madden
3

rewriteNie modyfikuje parametry żądania tylko część ścieżki URI. Z mojego doświadczenia, mieszanie się z przepisywaniem prowadzi do dziwnych cykli, w których nowy parametr jest dodawany ad infinitum. Przepisywanie prawdopodobnie nie jest sposobem na zrobienie tego w Nginx.

Zamiast tego należy zmodyfikować $argszmienną za pomocą setdyrektywy:

set $args $args&locale=de-de;
Palimondo
źródło
Nie zgadzam się, że $argsnależy to zmutować. Zamiast tego zobacz rozwiązanie @ AlexanderAzarov.
Dziękuję