Mam uruchomioną aplikację internetową http://example.com/
i chcę „zamontować” inną aplikację na osobnym serwerze http://example.com/en
. proxy_pass
Wydaje się, że serwery nadrzędne działają, ale w przypadku jednego problemu:
upstream luscious {
server lixxxx.members.linode.com:9001;
}
server {
root /var/www/example.com/current/public/;
server_name example.com;
location /en {
proxy_pass http://luscious;
}
}
Podczas otwierania example.com/en
moja poprzednia aplikacja powraca 404 not found /en
. Ma to sens, ponieważ górny bieg nie ma ścieżki /en
.
Czy proxy_path
to właściwe rozwiązanie? Czy powinienem przepisać „upstream”, aby /en
zamiast tego nasłuchiwał , ponieważ jest to ścieżka root? Czy też istnieje dyrektywa, która pozwala mi przepisać ścieżkę przekazywaną do góry?
proxy_pass
robi różnicę. Ponadto, ta odpowiedź jest bardziej poprawna niż ta, którą wymyśliłeś, ponieważ zapewnia również, żeproxy_redirect
pozostanie wdefault
, więc możesz nadal używać302
et al w swoim backendie i mieć poprawne działanie wszędzie.Chciałbym odpowiedzieć na nową odpowiedź opartą na wyrażeniach regularnych, która zyskuje na popularności.
Rozwiązanie na pierwszy rzut oka może wydawać się bardziej urocze, ale jest błędne z wielu powodów.
Powyższy regex pasowałby do identyfikatora uri żądania
/enjoy
, przekierowując go do/joy
upstream. Czy to naprawdę jest zamierzone?Prośba o
/en
nie spowoduje żadnych przekierowań, bezpośrednio obsługujących/
z nadrzędnego (prawie tak, jakby prośba/en/
została wysłana zamiast, ale nie do końca). Jeśli używasz względnych identyfikatorów URI na stronie głównej w górę (w innym przypadku, dlaczego nie miałbyś/en/
prefiksu bezpośrednio w obrębie wcześniejszych identyfikatorów?), Np.src="style.css"
(Która może odnosić sięurl("menu.png")
na przykład do określonego języka ), wtedy przeglądarka zażąda jak/style.css
zamiast/en/style.css
. (Lub nawet jeśli wszędzie używasz bezwzględnych identyfikatorów URI, a jeśli ktoś odwołuje się do nieznanego zasobu częściowo opcjonalnego?) Ups, witryna nagle może nie działać, ale tylko czasami lub w skrajnych przypadkach.Zgodnie z moją wcześniejszą radą dotyczącą innego pytania, które zostało już wspomniane przez własną odpowiedź PO , użycie wyrażeń regularnych uniemożliwia, by
proxy_redirect
dyrektywa miała domyślną wartośćdefault
,off
zamiast tego ją obniżyła . Oznacza to, że jeśli poprzedni użytkownik odpowie,Location: http://127.0.0.1:8080/en/dir/
kiedy/en/dir
zostanie złożone żądanie , wówczas zobaczy to klient, co oczywiście nie będzie działać poprawnie. (Co byłoby szczególnie ironiczne w przypadku/en
żądania, które w pierwszej kolejności zachęca do użycia wyrażenia regularnego, jednak ta konkretna implementacja cierpi z powodu innego problemu, jak już wspomniano powyżej.) Ponadto, jeśli już używaszupstream
dyrektywy, to może stać się wyjątkowo brzydkie, jeśli po prostu spróbujesz użyć niestandardowego, szczególnie jeśli masz więcej niż jeden serwer nadrzędny - w jaki sposób masz osobnyproxy_redirect
dla każdego z nich? Możesz również użyć wyrażeń regularnychproxy_redirect
, może nawet w celu dopasowania do dowolnego hosta, ale co wtedy, jeśli zdecydujesz się na przekierowanie między domenami w przyszłości?Aby spróbować rozwiązać niektóre z powyższych punktów za pomocą pojedynczej lokalizacji opartej na wyrażeniach regularnych, moglibyśmy wykonać następujące czynności (zauważ, że w celu
proxy_pass
uproszczenia również musieliśmy usunąć odwołanie do serwera zupstream
dyrektywy opartej na wyrażeniach regularnychproxy_redirect
):Tak więc, jeśli zapytasz mnie, oryginalne rozwiązanie z dwoma rodzeństwami na najwyższym poziomie nadal byłoby lepszym pomysłem niż wykopanie się w króliczej nucie, zamiast tego wybranie trasy wyrażenia regularnego.
źródło
nginx: [emerg] location "/en" is outside location "^/en/?((?<=/).*
Znalazłem odpowiedź na stackoverflow :
Zasadniczo: przekazywanie wyrażenia regularnego do lokalizacji i przekazywanie odnośnika zwrotnego do adresu URL proxy_pass.
źródło
Księgowość do dokumentów Nginx
Aby przekazać żądanie do serwera proxy HTTP, dyrektywa proxy_pass jest określona w lokalizacji. Na przykład:
Ta przykładowa konfiguracja powoduje przekazanie wszystkich żądań przetworzonych w tej lokalizacji do serwera proxy pod określonym adresem. Ten adres można podać jako nazwę domeny lub adres IP. Adres może również zawierać port:
Zauważ, że w pierwszym przykładzie powyżej po adresie serwera proxy znajduje się identyfikator URI, / link /. Jeśli identyfikator URI jest podany wraz z adresem, zastępuje on część identyfikatora URI żądania, który pasuje do parametru lokalizacji. Na przykład tutaj żądanie z /some/path/page.html URI będzie proxy do http://www.example.com/link/page.html . Jeśli adres jest określony bez identyfikatora URI lub nie jest możliwe określenie części identyfikatora URI, która ma zostać zastąpiona, pełny identyfikator URI żądania jest przekazywany (ewentualnie modyfikowany).
źródło