W Nginx próbowaliśmy przekierować adres URL w następujący sposób:
http://example.com/some/path -> http://192.168.1.24
gdzie użytkownik nadal widzi oryginalny adres URL w przeglądarce. Gdy użytkownik zostanie przekierowany, powiedz, że kliknął link do /section/index.html
, chcielibyśmy, aby zgłoszenie to prowadziło do przekierowania
http://example.com/some/path/section/index.html -> http://192.168.1.24/section/index.html
i ponownie zachowaj oryginalny adres URL.
Nasze próby obejmowały różne rozwiązania wykorzystujące proxy i reguły przepisywania, a poniżej pokazuje konfigurację, która zbliżyła nas do rozwiązania (zauważ, że jest to konfiguracja serwera WWW dla example.com
serwera WWW). Nadal istnieją jednak dwa problemy:
- Nie wykonuje poprawnie przepisywania, ponieważ adres URL żądania otrzymany przez serwer WWW
http://192.168.1.24
zawiera,/some/path
a zatem nie obsługuje wymaganej strony. Po najechaniu kursorem na link po wyświetleniu strony
/some/path
brakuje adresu URLserver { listen 80; server_name www.example.com; location /some/path/ { proxy_pass http://192.168.1.24; proxy_redirect http://www.example.com/some/path http://192.168.1.24; proxy_set_header Host $host; } location / { index index.html; root /var/www/example.com/htdocs; } }
Szukamy rozwiązania, które wymaga jedynie zmiany konfiguracji serwera WWW example.com
. Jesteśmy w stanie zmienić konfigurację na 192.168.1.24
(także Nginx), jednak chcemy tego uniknąć, ponieważ będziemy musieli powtórzyć tę konfigurację dla setek różnych serwerów, przez których dostęp jest proxy example.com
.
root
wewnątrzlocation
bloku, wtedy nie uzyskasz żadnego nieoczekiwanego zachowania dla domyślnych lokalizacji. Tylko jeśli musisz zmienić ustawienie domyślneroot
dla każdej lokalizacji, możesz z niego korzystać.Powinieneś użyć części URI w
proxy_pass
dyrektywie. Pomieszałeś też argumenty dotyczące porządkuproxy_redirect
dyrektywy i prawdopodobnie wcale jej nie potrzebujesz. Nginx ma rozsądne domyślne ustawienie tej dyrektywy.W takim przypadku Twój
location
blok może być naprawdę prosty:źródło
/some/path/
część adresu URL jest zachowywana w żądaniu, które nie jest prawidłowym adresem URL (musimy go również przepisać, aby go usunąć).Możesz użyć poniższej konfiguracji, aby uzyskać 100% płynne mapowanie między
/some/path/
front-/
endem i backendem.Zauważ, że jest to jedyna jak dotąd odpowiedź, która bezproblemowo zajmowałaby się także generowaniem
404 Not Found
błędów bezwzględnych ścieżek , pod warunkiem, żeReferer
przeglądarka wysyła poprawny nagłówek HTTP , więc wszystkie te gify powinny nadal się ładować bez potrzeby modyfikowania podstawowego kodu HTML (co jest nie tylko drogie, ale także nie jest obsługiwane bez dodatkowych modułów, które nie zostały skompilowane domyślnie).Można znaleźć kompletny proof-of-concept i minimal-realny produkt uboczny w ramach https://github.com/cnst/StackOverflow.cnst.nginx.conf repozytorium.
Oto przebieg testowy, aby potwierdzić, że wszystkie przypadki krawędzi wydają się działać:
PS Jeśli masz wiele różnych ścieżek do zmapowania, to zamiast przeprowadzania porównania wyrażeń regularnych
$http_referer
wif
obrębielocation @404
, możeszmap
zamiast tego skorzystać z globalnej dyrektywy.Zauważ też, że końcowe ukośniki zarówno w
proxy_pass
, jak i wlocation
nim zawarte, są dość ważne, jak na pokrewną odpowiedź .Bibliografia:
źródło
Po dodaniu tego ukośnika do jenkins z serwerem proxy nginx pojawia się błąd „Wygląda na to, że konfiguracja odwrotnego proxy jest zepsuta”.
Powinien przeczytać
źródło