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?0i 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?0w pasku adresu, a wszystkie kolejne adresy URL i treść byłyby obsługiwane w domenie serwera WWW i bez jellyfishbał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ł jellyfishi 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_rewritei bez niej [P], ale bez powodzenia. Następnie wypróbowałem ProxyPassMatchdyrektywę, 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_securityreguł, 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/homeale 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?0ale 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 homepochodzi część adresu URL w pierwszym przykładzie.
Czy ktoś może skierować mnie w dobrym kierunku?
Dzięki, J.
ProxyPassMatchje równoważnym użyciemmod_rewrite, które rozwiązuje problem usuwaniajellyfishz 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/