Apache2 виртуальный хост обратный прокси переписывает ссылки на ресурсы

Apache2 виртуальный хост обратный прокси переписывает ссылки на ресурсы

У меня есть веб-приложение, работающее на порту 8080 на моем сервере: myip:8080/app

У меня в httpd.conf следующая конфигурация

<VirtualHost *:80>
 ServerName subdomain.mydomain.com
 ServerAlias mydomain.com
 ProxyPass /app http://localhost:8080/app/
 ProxyPassReverse /app http://localhost:8080/app/
</VirtualHost>

Это отлично работает и делает приложение доступным по адресу subdomain.mydomain.com/app.

Теперь я пытаюсь сделать его доступным на subdomain.mydomain.com (без /app). Сначала я попробовал

<VirtualHost *:80>
 ServerName subdomain.mydomain.com
 ServerAlias mydomain.com
 ProxyPass / http://localhost:8080/app/
 ProxyPassReverse / http://localhost:8080/app/
</VirtualHost>

и также добавил

ProxyHTMLURLMap /app/ /

но оба, похоже, не работают. Главная страница загружается, но все ссылки javascript и CSS по-прежнему указывают на /app/..., который возвращает главную html-страницу вместо актива.

Что я упускаю? На правильном ли я пути или есть совершенно другой (лучший) способ добиться этого?

Приложение представляет собой веб-приложение Tapestry для Tomcat 7 на Ubuntu 12.04.

Любые соображения по поводу производительности также были бы интересны.

решение1

ProxyPassReverseработает только с заголовками HTTP (например, перенаправления 301).

Чтобы включить HTML-перезапись, вам необходимо включить ее через:

ProxyHTMLEnable On
ProxyHTMLURLMap /app/ /

Однако современные веб-приложения могут легко понять, что происходит, из HTTP-запроса, сделанного обратными прокси-серверами, и в этом случае дополнительная настройка на уровне прокси-сервера обычно не требуется.

Имейте в виду, что mod_proxy_htmlобработка таких запросов влечет за собой некоторые накладные расходы.

решение2

Ответ Джованни направил меня на верный путь. Мне нужно было добавить

ProxyHTMLEnable On

или точнее (для моей версии mod_proxy_html) эквивалент

SetOutputFilter INFLATE;proxy-html;DEFLATE

Однако я решил использовать его в сочетании с переписыванием (поскольку я не мог заставить ссылки на события Tapestry работать каким-либо другим способом):

<VirtualHost *:80>
 ServerName subdomain.mydomain.com
 ServerAlias mydomain.com
 ProxyRequests Off
 ProxyPreserveHost On
 SetOutputFilter INFLATE;proxy-html;DEFLATE     
 ProxyPass / http://localhost:8080/app/
 ProxyPassReverse / http://localhost:8080/app/
 ProxyHTMLURLMap /app/ /     
 ProxyPassReverseCookiePath /app /
 RewriteEngine on
 RewriteRule ^/app/(.+) /$1 [R,L]
</VirtualHost>

Мне также нужно было адаптировать путь к файлу cookie ( ProxyPassReverseCookiePath /app /) для работы моего сеансового файла cookie Tomcat.

решение3

Ваше веб-приложение, myip:8080/appвероятно, имеет множество абсолютных путей в HTML и JS, начинающихся с /app/...которых, не все из которых могут быть перехвачены и переписаны с помощью mod_proxy_html.

Я бы посоветовал сначала попробовать запустить ваше приложение на разных локальных URL-адресах, например myip:8080/blah. Откройте панель инструментов разработчика в браузере и проверьте вкладку «Сеть» на наличие файлов, которые все еще запрашиваются, /app/...и исправьте их, пока они не заработают на обоих URL-адресах (/blah и /app).

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

<script type="text/javascript" src="file.js"></script>

вместо чего-то вроде этого

<script type="text/javascript" src="/app/file.js"></script>

Также ознакомьтесь с<base>тег для способа переопределения базового URL-адреса по умолчанию.

Связанный контент