Я развертываю Apache перед приложением, размещенным в Karaf (Apache и Karaf находятся на разных серверах). Я хочу, чтобы Apache работал как обратный прокси, а также скрыл часть URL-адреса.
URL-адрес для получения страницы входа в приложение непосредственно с сервера приложений: http://app-server:8181/jellyfish
. Страницы обслуживаются экземпляром Jetty, работающим в Karaf. Конечно, такое поведение обычно блокируется брандмауэром для всего, кроме обратного прокси-сервера.
Если брандмауэр выключен, если вы нажмете этот 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]
flag, чтобы обойти это, но безуспешно. Затем я попробовал 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
- NB адресная строка браузера не содержит двойных /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 взят из первого примера.
Кто-нибудь может указать мне правильное направление, пожалуйста?
Спасибо, Дж.
Вот как я заставил его работать. Помимо изменений в соответствии с моим комментарием к моему исходному вопросу, мне нужно было исключить .js
и .css
из правила, добавившего косую черту в конце.
<VirtualHost *:80>
ServerAdmin admin@localhost
ServerName mydomain.com
ServerAlias www.mydomain.com
ErrorLog ${APACHE_LOG_DIR}/error.log
LogLevel warn
CustomLog ${APACHE_LOG_DIR}/access.log combined
RewriteLog ${APACHE_LOG_DIR}/rewrite.log
RewriteLogLevel 9
Alias /images/ "/var/www/images/"
RewriteEngine On
# rewrite rule to prevent proxy exploit
RewriteCond %{REQUEST_URI} !^$
RewriteCond %{REQUEST_URI} !^/
RewriteRule .* - [R=400,L]
# consolidate non-www requests onto the www subdomain
RewriteCond %{HTTP_HOST} ^yourdomain\.com$
RewriteRule ^(.*) http://www.yourdomain.com/$1 [R=301,L]
# Add a trailing slash to the URL (ignoring images, CSS and JavaScript)
RewriteCond %{REQUEST_URI} !^/(images)(.*)$
RewriteCond %{REQUEST_URI} !^/(.*)(.js|.css)$
RewriteCond %{REQUEST_URI} !(.*)/$
RewriteRule ^(.*)$ http://%{HTTP_HOST}$1/ [R=301,L]
# 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/
# suppress mod_security rules that were giving false positives
SecRuleRemoveById 981059 981060
<Directory "/var/www/images">
Options Indexes MultiViews FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
Ты пробовала:
ProxyPassMatch ^/(.*) http://granny-server:8181/$1
ProxyPassReverse / http://granny-server:8181
Или еще проще:
ProxyPass / http://granny-server:8181/
ProxyPassReverse / http://granny-server:8181/
Я написал, как я работаю с обратным проксированием Apache и Tomcat здесь если вы хотите сравнить / сопоставить то, что вы настроили, с тем, что использую я.
Вы можете добавить это, чтобы добавить косую черту в конце URL:
# Settings for adding a trailing slash to the URL
RewriteEngine On
RewriteCond %{REQUEST_URI} ^/$
RewriteRule ^(.*)$ http://%{HTTP_HOST}$1/ [R=301,L]