Przepisywanie adresów URL Apache w odwrotnym proxy

12

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.

Jeremy Gooch
źródło
Poczyniłem pewne postępy w tej kwestii i zastąpiłem ProxyPassMatchje równoważnym użyciem mod_rewrite, które rozwiązuje problem usuwania jellyfishz 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/
Jeremy Gooch,

Odpowiedzi:

10

W ten sposób udało mi się to uruchomić. Jak również zmiany, jak na mój komentarz do mojego pierwotnego pytania, musiałem wyłączyć .jsi .cssod zasady, że dodaje się ukośnik.

<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>
Jeremy Gooch
źródło
1

Czy próbowałeś:

ProxyPassMatch ^/(.*) http://granny-server:8181/$1
ProxyPassReverse / http://granny-server:8181

Lub jeszcze prościej:

ProxyPass / http://granny-server:8181/
ProxyPassReverse / http://granny-server:8181/

Napisałem tutaj, jak sobie radzę z odwrotnym proxy Apache i Tomcat , jeśli chcesz porównać / skontrastować to, co konfigurujesz z tym, czego używam.

Możesz dodać to, aby dodać ukośnik do adresu URL:

# Settings for adding a trailing slash to the URL
RewriteEngine On
RewriteCond %{REQUEST_URI} ^/$
RewriteRule ^(.*)$ http://%{HTTP_HOST}$1/ [R=301,L]
JakeGould
źródło
Wielkie dzięki za odpowiedź. Niestety rozwiązuje to jedynie bezpośrednią część problemu. http://web-serverTęsknię za tym, jak usunąć słowo „meduza” z widoczności w pasku adresu przeglądarki klienta, tak że po cichu dostaje się do serwera proxy http://app-server:8181/jellyfishiz powrotem.
Jeremy Gooch,