2015-09-12 12 views
42

Jestem przyzwyczajony do używania Apache z mod_proxy_html i próbuję osiągnąć coś podobnego w NGINX. Konkretny przypadek użycia jest to, że mam interfejs administracyjny działa w Tomcat na porcie 8080 na serwerze w kontekście głównego:Jak przerobić adresy URL w odpowiedzi serwera proxy w NGINX

http://localhost:8080/ 

muszę powierzchnia to na porcie 80, ale mam inne konteksty na serwerze nginx uruchomiony na tym komputerze, więc spróbować i uzyskać dostęp do tego na:

http://localhost:80/admin/ 

miałem nadzieję, że poniższy bardzo prosty dom serwer zrobi to, ale to nie całkiem:

server { 
    listen 80; 
    server_name screenly.local.akana.com; 

    location /admin/ { 
     proxy_pass http://localhost:8080/; 
    } 
} 

Problem polega na tym, że zwrócona zawartość (html) zawiera adresy URL skryptów i informacji o stylu, do których dostęp jest dostępny w kontekście głównym, więc muszę przekonwertować te URL-e na początek z/admin/zamiast /.

Jak to zrobić w NGINX?

Odpowiedz

55

Istnieją dwa zasadnicze ustawienia dla Nginx „proxy_pass” dyrektywy w zależności od tego, czy ukośnik jest obecne lub nieobecne:

location /some_dir/ { 
    proxy_pass http://some_server/; 
} 

lub

location /some_dir/ { 
    proxy_pass http://some_server; 
} 

Z pierwszą, wniosek o http://your_server/some_dir/some_subdir/some_file zostanie przeniesiony do http://some_server/some_subdir/some_file.

Zasadniczo /some_dir/ zostaje zastąpiony przez / zmienić ścieżkę do żądania od /some_dir/some_subdir/some_file/some_subdir/some_file.

Z drugim (bez ukośnego ukośnika), to samo żądanie zostanie przekazane do usługi http://some_server/some_dir/some_subdir/some_file.

Zasadniczo pełna oryginalna ścieżka żądania zostaje przekazana bez zmian.

W twoim przypadku wydaje się, że powinieneś po prostu upuścić końcowy ukośnik, aby uzyskać to, czego chcesz.

EDIT

ponownie Czytając twoje pytanie, wydaje się, że może zostały pominięte, że po prostu chcesz edytować HTML.

W tym celu można 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 chcesz zastąpić, a ciąg wymiana

+0

Dzięki, że bardzo pomaga.Myślę, że sub_filter to zrobi. – IanG

+1

jestem osobliwości do jakiego stopnia nginx jest już przepisywanie wyjście, woudln't musiał ponownie napisać hosta/nazwę hosta w linki na minimum? Tak na przykład, czy nie jesteś 'sub_filter "http: // localhost /" "http: // localhost/admin /"' – ThorSummoner

+0

Aby umożliwić przepisywanie inny niż 'text/html' mimetype, musiałem dodać również' sub_filter_types *; '. – anttikoo

5

Konieczne może być również następującą dyrektywę należy ustawić przed pierwszym „sub_filter” dla backend serwerów z danymi kompresja:

proxy_set_header Accept-Encoding ""; 

W przeciwnym razie może nie działać. Na przykład będzie wyglądać następująco:

location /admin/ { 
    proxy_pass http://localhost:8080/; 
    proxy_set_header Accept-Encoding ""; 
    sub_filter "http://your_server/" "http://your_server/admin/"; 
    sub_filter_once off; 
} 
Powiązane problemy