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