Я розгортаю Apache перед додатком, розміщеним у Карафі (Apache та Karaf є на окремих серверах). Я хочу, щоб Apache працював як зворотний проксі, а також приховував частину URL-адреси.
URL-адреса для отримання сторінки входу програми безпосередньо з сервера додатків є http://app-server:8181/jellyfish
. Сторінки обслуговуються екземпляром Jetty, що працює в Карафі. Звичайно, брандмауер зазвичай блокує таку поведінку, окрім зворотного проксі-сервера.
Якщо брандмауер вимкнений, якщо ви потрапили на цю URL-адресу, тоді Jetty завантажує сторінку входу. Адресна панель браузера правильно змінюється http://app-server:8181/jellyfish/login?0
і все працює.
Я хочу, щоб http://web-server
(тобто з коренем) відобразити карту Jetty на сервері додатків із jellyfish
придушеним ім'ям програми ( ). наприклад, браузер зміниться, щоб відображатися http://web-server/login?0
в адресному рядку, і всі наступні URL-адреси та вміст подаватимуться з доменом веб-сервера та без jellyfish
захаращення.
Я можу змусити Apache працювати як простий зворотний проксі, використовуючи таку конфігурацію (фрагмент): -
ProxyPass /jellyfish http://app-server:8181/jellyfish
ProxyPassReverse / http://app-server:8181/
... але для цього потрібно, щоб URL-адреса браузера містила, jellyfish
і перехід до кореневої URL-адреси ( http://web-server
) дає 404 Not Found.
Я витратив чимало часу, намагаючись mod_rewrite
з цим [P]
прапором використати і без нього , але без успіху. Тоді я спробував цю ProxyPassMatch
директиву, але, здається, не цілком коректний.
Ось поточна конфігурація, завантажена /etc/apache2/sites-available/
на веб-сервер. Зауважте, що існує локальний каталог зображень. Я також дотримувався захисту захисту від проксі mod_rewrite і пригнічую пару mod_security
правил, які давали помилкові позитиви.
<VirtualHost *:80>
ServerAdmin admin@drummer-server
ServerName drummer-server
ErrorLog ${APACHE_LOG_DIR}/error.log
LogLevel warn
CustomLog ${APACHE_LOG_DIR}/access.log combined
Alias /images/ "/var/www/images/"
RewriteEngine On
RewriteCond %{REQUEST_URI} !^$
RewriteCond %{REQUEST_URI} !^/
RewriteRule .* - [R=400,L]
ProxyPass /images !
ProxyPassMatch ^/(.*) http://granny-server:8181/jellyfish/$1
ProxyPassReverse / http://granny-server:8181/jellyfish
ProxyPreserveHost On
SecRuleRemoveById 981059 981060
<Directory "/var/www/images">
Options Indexes MultiViews FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
Якщо я переходжу до http://web-server
мене, я переспрямовуюсь, http://web-server/jellyfish/home
але це дає 404, із скаргою на спробу доступу /jellyfish/jellyfish/home
- НЕ зверніть увагу, що адресна панель браузера не містить подвійного /jellyfish
.
HTTP ERROR 404
Problem accessing /jellyfish/jellyfish/home. Reason:
Not Found
І якщо я піду до http://web-server/login
мене, я переспрямовуюсь, http://web-server/jellyfish/login?0
але це дає номер 404 із скаргою на спробу доступу /jellyfish/jellyfish/login
.
HTTP ERROR 404
Problem accessing /jellyfish/jellyfish/login. Reason:
Not Found
Отже, я здогадуюсь, що я якось двічі проходжу правила. Я також трохи збентежений, звідки home
походить біт URL-адреси в першому прикладі.
Чи може хтось вказати мені в правильному напрямку, будь ласка?
Дякую, Дж.
ProxyPassMatch
на еквівалентне використанняmod_rewrite
, яке вирішує проблему видаленняjellyfish
з URL-адрес. Зараз я розглядаю кількість 404-х, які потім спливають стосовно основних елементів, таких як компоненти Віккету, необхідні Карафу. Ось фрагмент коду:# proxy to the Jellyfish server (ignoring images) RewriteCond %{REQUEST_URI} !^/(images)(.*)$ RewriteRule ^(/.*)$ http://app-server:8181/jellyfish$1 [P] ProxyPassReverse / http://app-server:8181/jellyfish/