У меня есть веб-приложение, работающее на порту 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 по умолчанию.