Apache Proxypass не разрешает URL для таких ресурсов, как изображения и CSS
Мне нужно сопоставить путь к моему веб-приложению Tomcat. Я использовал proxypass для этого. это текущий конфиг в apache2
<VirtualHost *:80>
ServerName localhost:80
ProxyPass /app http://localhost:8088/ui/
ProxyPassReverse /app http://localhost:8088/ui/
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
Это получает HTML от tomcat, но сформированный URL CSS неправильный. Вместо http://localhost/app/css/style.css
URL отображается как http://localhost/ui/css/style.css
,
Я пытался использовать переписать, но это не сработало.
RewriteEngine on
RewriteRule ^/ui/ /app/
Мне нужно найти правильный способ исправить URL. Любая помощь будет принята с благодарностью! Заранее спасибо.
2 ответа
После долгих проб и ошибок я нашел два разных решения моей проблемы.
Использование mod_rewrite и некоторые изменения в proxypass:
<VirtualHost *:80> ProxyPreserveHost On ProxyPass /app http://localhost:8080/ui/ ProxyPassReverse /app http://localhost:8080/ui/ #since in java web app the context started with /ui the js src had /ui in the beginning #this resulted in 404 so I had to rewrite all request to /ui to forward to /app RewriteEngine on RewriteRule "^/ui(.+)" "/app$1" [R,L] ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined </VirtualHost>
Создайте ссылку / ярлык для развернутого приложения в папке webapp и назовите ярлык как app В linux команда есть (из папки webapp)
ln -s ui app
Теперь конфиг apache:
<VirtualHost *:80>
ProxyPreserveHost On
<Location /app>
ProxyPass ajp://localhost:8019/app/
ProxyPassReverse ajp://localhost:8019/app/
SetOutputFilter proxy-html
ProxyHTMLExtended On
ProxyHTMLURLMap /app /app
RequestHeader unset Accept-Encoding
</Location>
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
В первом решении мод rewrite заставляет запрос возвращать 304 перед перенаправлением на правильный URL. Вот как это работает по умолчанию.
Во втором решении, поскольку оба обработчика одинаковы (/ app), нет причин для перенаправления, и URL-адреса сопоставлены правильно.
Это зависит от того, что вы хотите, чтобы отображаемый URL был. Если вы хотите, чтобы это было
HTTP: // локальный / приложение /
Затем вам нужно переместить статический контент в / ui / в вашей WAR.
Если ты хочешь
HTTP: // локальный / приложение / щ
Затем вы должны удалить трейлинг / интерфейс из ваших строк ProxyPass
В качестве третьего варианта вы можете создать символическую ссылку "ROOT" на "ui" в каталоге веб-приложения tomcat (и удалить / ui из прокси-сервера), что позволит вам обслуживать ваше приложение из корня пути tomcat.