Nginx działa na porcie 80 i używam go do odwracania adresów URL proxy ze ścieżką /foo
do portu w 3200
ten sposób:
location /foo {
proxy_pass http://localhost:3200;
proxy_redirect off;
proxy_set_header Host $host;
}
Działa to dobrze, ale mam aplikację na porcie 3200
, dla której nie chcę, /foo
aby wysyłano inicjał . To znaczy - kiedy uzyskuję dostęp http://localhost/foo/bar
, chcę być tylko /bar
ścieżką otrzymaną przez aplikację. Próbowałem więc dodać tę linię do powyższego bloku lokalizacji:
rewrite ^(.*)foo(.*)$ http://localhost:3200/$2 permanent;
Powoduje to przekierowanie 302 (zmiana adresu URL), ale chcę 301. Co powinienem zrobić?
nginx
reverse-proxy
301-redirect
jeffreyveon
źródło
źródło
Odpowiedzi:
Każde przekierowanie do localhost nie ma sensu ze zdalnego systemu (np. Przeglądarki internetowej klienta). Tak więc flagi przepisywania na stałe (301) lub przekierowania (302) nie są w twoim przypadku przydatne.
Spróbuj wykonać następującą konfigurację przy użyciu przezroczystej reguły przepisywania:
Służy
curl -i
do testowania przepisywania. Bardzo subtelna zmiana reguły może spowodować, że nginx wykona przekierowanie.źródło
/foo(.*)
, w przeciwnym razieexample.com/foo
nie zostanie dopasowane. (prawdopodobnie tego doświadczył jeffreyveon)Proste dopasowanie prefiksu lokalizacji działa w tym przypadku bez użycia reguły przepisywania, o ile podasz identyfikator URI w dyrektywie proxy_pass:
Zwróć uwagę na dodatkowe
/
na końcuproxy_pass
dyrektywy. NGINX usunie dopasowany prefiks/foo
i przekaże resztę do serwera zaplecza pod adresem URI/
. W związku z tymhttp://myserver:80/foo/bar
wyśle wiadomość do zaplecza ohttp://localhost:3200/bar
.Z dokumentów NGINX na proxy_pass :
źródło
//xyz
Jeśli tak zrobisz, dane te zostaną przekazane hostowi.Absolutnie najbardziej poprawny sposób i najlepsza praktyka są zwykle następujące:
Zwróć uwagę na ogromne znaczenie końcowego ukośnika
proxy_pass
, który automatycznie zmienia$uri
zmienną tak, aby/foo/
przedni koniec był zgodny z/
backendem. Nie ma potrzeby wyraźnejrewrite
dyrektywy.Dodatkowo należy zauważyć, że The spływu
/
wlocation
jest bardzo ważne, a także - bez niego, istnieje ryzyko konieczności dziwnie wyglądający adres URL na swojej stronie w pewnym momencie (np obróbki/fooen
oprócz/foo/en
).Dodatkowo, zakończenie
/
wlocation
zproxy_pass
zapewnia również pewne specjalne postępowanie , zgodnie z dokumentacjąlocation
dyrektywy, aby skutecznie powodować również domniemanelocation = /foo {return 301 /foo/;}
.Tak więc, definiując za
location
pomocą ukośnika końcowego, jak powyżej, nie tylko upewniasz się, że takie URL-e bez sufiksu/fooen
nie będą prawidłowe, ale także, że/foo
ukośnik bez końcowego ukośnika będzie nadal działał.Dokumentacja referencyjna:
źródło
$args
są zgubione:http://frontend/foo?bar=baz
zostaną przybliżonehttp://backend/
. Zauważ, że argumenty nie są częścią$args
że nadal powinienem być odpowiednio obsługiwany, jeśli użyjesz powyższego kodu, ponieważ są one oddzielone$uri
i powinny zostać ponownie złożone, chyba że używasz w nich wyraźnych zmiennychproxy_pass
./foo
przekierowywania do/foo/
, więc jeśli nie robisz czegoś dziwnego na backendie, nawet/foo
żądania będą nadal działać z powyższym kodem. (To właściwie jest już część odpowiedzi, BTW.)próbować
lub
źródło
//xyz
Jeśli tak zrobisz, dane te zostaną przekazane hostowi.@Terabuck Przepraszamy za brak odpowiedzi.
Nie powinieneś używać localhost, ponieważ zależy to od faktu, że aplikacja działa na serwerze z plikiem hosts. host lokalny jest tylko domyślnym tłumaczeniem na 127.0.0.1. Nic nie wskazuje, że musisz mieć te pliki hostów. Po prostu jest to bardzo powszechne.
Posiadanie interfejsu sprzężenia zwrotnego jest kolejną powszechną rzeczą, na której można polegać, ale nadal jesteś zależny od interfejsu sprzężenia zwrotnego na stosie sieciowym. Rzadko zdarza się, aby nie mieć tych dwóch. Jeśli kiedykolwiek będziesz się tym martwić. Przynajmniej na unix / linux masz opcję gniazd. To wyeliminuje konieczność, aby stos sieciowy osiągnął hosta lokalnego. Zachowaj ostrożność przy takim podejściu, ponieważ istnieje kilka czynników, które pojawią się w systemie operacyjnym hosta. Takich jak liczba otwartych plików itp.
źródło