Как переписать URL-адреса в ответе прокси-сервера в NGINX

Я привык использовать Apache с mod_proxy_html и пытаюсь достичь чего-то подобного с NGINX. Конкретный случай использования заключается в том, что у меня есть пользовательский интерфейс администратора, работающий в Tomcat на порту 8080 на сервере в корневом контексте:

http://localhost:8080/

мне нужно отобразить это на порту 80, но у меня есть другие контексты на сервере NGINX, работающем на этом хосте, поэтому хочу попробовать получить доступ к этому по адресу:

http://localhost:80/admin/

Я надеялся, что следующий супер простой серверный блок сделает это, но это не совсем:

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

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

проблема в том, что возвращаемый контент (html) содержит URL-адреса скриптов и информацию о стиле, доступ к которым осуществляется в корневом контексте, поэтому мне нужно переписать эти URL-адреса, чтобы начать с /admin/ вместо /.

как это сделать в NGINX?

3 ответов


есть две широкие настройки для nginx и директивы proxy_pass в зависимости от того, Слэш присутствует или отсутствует:

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

или

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

С первым запросом на http://your_server/some_dir/some_subdir/some_file запрос будет передан на http://some_server/some_subdir/some_file.

по сути, /some_dir/ заменяется / изменить путь запроса от /some_dir/some_subdir/some_file to /some_subdir/some_file.

со вторым (без косой черты) тот же запрос будет проксирован в http://some_server/some_dir/some_subdir/some_file.

в основном, полный оригинальный путь запроса передается без изменений.

Итак, в вашем случае, кажется, вы должны просто отбросить косую черту, чтобы получить то, что хотите.

редактировать

читая ваш вопрос снова, кажется, я, возможно, пропустил, что вы просто хотите отредактировать вывод html.

для этого вы можете использовать совместном использовании sub_filter


вам также может потребоваться следующая директива, которая будет установлена перед первым "sub_filter" для backend-серверов со сжатием данных:

proxy_set_header Accept-Encoding "";

в противном случае это может не сработать. Для вашего примера это будет выглядеть так:

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;
}

вы можете использовать следующий пример конфигурации nginx:

upstream adminhost {
  server adminhostname:8080;
}

server {
  listen 80;

  location ~ ^/admin/(.*)$ {
  proxy_pass http://adminhost/$is_args$args;
  proxy_redirect off;
  proxy_set_header Host $host;
  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_set_header X-Forwarded-Host $server_name;
}