Najpierw powinniśmy uważnie i w pełni przeczytać dokumentację dotyczącą proxy_pass .
Identyfikator URI przekazany do serwera nadrzędnego jest określany na podstawie tego, czy dyrektywa „proxy_pass” jest używana z identyfikatorem URI, czy nie. Końcowy ukośnik w dyrektywie proxy_pass oznacza, że identyfikator URI jest obecny i równy /
. Brak końcowego ukośnika oznacza brak identyfikatora URI.
Proxy_pass z URI :
location /some_dir/ {
proxy_pass http://some_server/;
}
W związku z powyższym istnieje następujący serwer proxy:
http:// your_server/some_dir/ some_subdir/some_file ->
http:// some_server/ some_subdir/some_file
Zasadniczo /some_dir/
zostaje zastąpiony przez, /
aby zmienić ścieżkę żądania z /some_dir/some_subdir/some_file
na /some_subdir/some_file
.
Proxy_pass bez URI :
location /some_dir/ {
proxy_pass http://some_server;
}
Z drugim (bez końcowego ukośnika): proxy wygląda tak:
http:// your_server /some_dir/some_subdir/some_file ->
http:// some_server /some_dir/some_subdir/some_file
Zasadniczo pełna oryginalna ścieżka żądania jest przekazywana bez zmian.
Więc w twoim przypadku wydaje się, że powinieneś po prostu porzucić końcowy ukośnik, aby uzyskać to, czego chcesz.
Caveat
Zauważ, że automatyczne przepisywanie działa tylko wtedy, gdy nie używasz zmiennych w proxy_pass. Jeśli używasz zmiennych, powinieneś przepisać siebie:
location /some_dir/ {
rewrite /some_dir/(.*) /$1 break;
proxy_pass $upstream_server;
}
Są inne przypadki, w których przepisywanie nie zadziała, dlatego czytanie dokumentacji jest koniecznością.
Edytować
Czytając ponownie twoje pytanie, wydaje mi się, że mogłem przegapić, że chcesz po prostu edytować wynik HTML.
W tym celu możesz użyć dyrektywy sub_filter . Coś jak ...
location /admin/ {
proxy_pass http://localhost:8080/;
sub_filter "http://your_server/" "http://your_server/admin/";
sub_filter_once off;
}
Zasadniczo ciąg, który chcesz zastąpić, i ciąg zastępujący
sub_filter "http://localhost/" "http://localhost/admin/"
text/html
typ MIME, musiałem również dodaćsub_filter_types *;
.http://your_server/admin/
się rozwiązania problemuhttp://your_server
podczas proxy_pass, ale tak się nie dzieje i otrzymuję błądreact-router /admin/ location did not match any routes
w mojej aplikacji, ponieważ moja aplikacja nie wie nic o „/ admin”.proxy_redirect
dyrektywy, abyLocation
nagłówek wysłany przez odpowiedź był również zmieniany zgodnie z adresem URL. Sprawdź ten samouczek: cyberciti.biz/faq/ ...Może być również konieczne ustawienie następującej dyrektywy przed pierwszym „sub_filter” w przypadku serwerów zaplecza z kompresją danych:
W przeciwnym razie może nie działać. Na przykład będzie wyglądać tak:
źródło
Możesz użyć następującego przykładu konfiguracji nginx:
źródło
proxy_redirect off;
jednak, dlaczego . Dodałbym teżproxy_set_header X-Forwarded-Proto $scheme;
.