Wdrażam Apache przed aplikacją hostowaną przez Karaf (Apache i Karaf są na osobnych serwerach). Chcę, aby Apache działał jako odwrotne proxy, a także ukrywał część adresu URL.
Adres URL strony logowania aplikacji bezpośrednio z serwera aplikacji to http://app-server:8181/jellyfish
. Strony są obsługiwane przez instancję Jetty działającą w systemie Karaf. Oczywiście takie zachowanie zwykle jest blokowane przez zaporę ogniową dla wszystkiego oprócz serwera odwrotnego proxy.
Gdy zapora jest wyłączona, jeśli trafisz ten adres URL, Jetty ładuje stronę logowania. Pasek adresu przeglądarki zmienia się prawidłowo http://app-server:8181/jellyfish/login?0
i wszystko działa.
Chcę, aby http://web-server
(tj. Z katalogu głównego) zmapować Jetty na serwerze aplikacji z pominiętą nazwą app ( jellyfish
). np. przeglądarka zmieniłaby się, aby wyświetlać się http://web-server/login?0
w pasku adresu, a wszystkie kolejne adresy URL i treść byłyby obsługiwane w domenie serwera WWW i bez jellyfish
bałaganu.
Mogę sprawić, aby Apache działał jako zwykły zwrotny serwer proxy, używając następującej konfiguracji (fragmentu kodu): -
ProxyPass /jellyfish http://app-server:8181/jellyfish
ProxyPassReverse / http://app-server:8181/
... ale wymaga to, aby adres URL przeglądarki zawierał jellyfish
i przejście do głównego adresu URL ( http://web-server
) daje wartość 404 Nie znaleziono.
Spędziłem dużo czasu próbując obejść tę flagę mod_rewrite
i bez niej [P]
, ale bez powodzenia. Następnie wypróbowałem ProxyPassMatch
dyrektywę, ale nie wydaje mi się, żeby to też było całkiem poprawne.
Oto aktualna konfiguracja wczytana /etc/apache2/sites-available/
na serwer WWW. Pamiętaj, że istnieje katalog obrazów hostowanych lokalnie. Zachowałem również ochronę przed exploitem mod_rewrite proxy i tłumię kilka mod_security
reguł, które dawały fałszywe alarmy.
<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>
Jeśli przejdę do http://web-server
, zostaniesz przekierowany do, http://web-server/jellyfish/home
ale daje to 404, z reklamacją dotyczącą próby uzyskania dostępu /jellyfish/jellyfish/home
- Uwaga: pasek adresu przeglądarki nie zawiera podwójnego /jellyfish
.
HTTP ERROR 404
Problem accessing /jellyfish/jellyfish/home. Reason:
Not Found
I jeśli pójdę do http://web-server/login
, zostaniesz przekierowany do, http://web-server/jellyfish/login?0
ale daje to 404, z skargą na próbę uzyskania dostępu /jellyfish/jellyfish/login
.
HTTP ERROR 404
Problem accessing /jellyfish/jellyfish/login. Reason:
Not Found
Zgaduję, że w jakiś sposób dwukrotnie przekraczam zasady. Jestem również nieco zaskoczony, skąd home
pochodzi część adresu URL w pierwszym przykładzie.
Czy ktoś może skierować mnie w dobrym kierunku?
Dzięki, J.
ProxyPassMatch
je równoważnym użyciemmod_rewrite
, które rozwiązuje problem usuwaniajellyfish
z adresów URL. Teraz patrzę na kilka 404, które następnie pojawiają się w odniesieniu do podstawowych elementów, takich jak elementy Wicket wymagane przez Karafa. Oto fragment kodu:# 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/