Назад | Перейти на главную страницу

Обратный прокси-сервер виртуального хоста 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.

Было бы интересно узнать о производительности.

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

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

ProxyHTMLEnable On
ProxyHTMLURLMap /app/ /

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

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

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

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 работал.

Ваше веб-приложение на 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 по умолчанию.