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.

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;

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

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;

Nie zgadzam się, że $argsnależy to zmutować. Zamiast tego zobacz rozwiązanie @ AlexanderAzarov.
Dziękuję
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.