Umschreiben von Apache-URLs im Reverse-Proxy

12

Ich stelle Apache vor einer von Karaf gehosteten Anwendung bereit (Apache und Karaf befinden sich auf getrennten Servern). Ich möchte, dass Apache als Reverse-Proxy fungiert und einen Teil der URL verbirgt.

Die URL, über die die Anmeldeseite der Anwendung direkt vom App-Server abgerufen wird, lautet http://app-server:8181/jellyfish. Die Seiten werden von der Jetty-Instanz bereitgestellt, die in Karaf ausgeführt wird. Natürlich wird dieses Verhalten normalerweise von der Firewall für alles außer dem Reverse-Proxy-Server blockiert.

Wenn Sie diese URL bei deaktivierter Firewall aufrufen, lädt Jetty die Anmeldeseite. Die Adressleiste des Browsers ändert sich korrekt zu http://app-server:8181/jellyfish/login?0und alles funktioniert.

Was ich möchte, ist für http://web-server(dh von der Wurzel) zu Jetty auf dem App-Server mit dem Namen der App ( jellyfish) unterdrückt. Beispiel: Der Browser wird http://web-server/login?0in der Adressleiste angezeigt und alle nachfolgenden URLs und Inhalte werden mit der Domain des Webservers und ohne jellyfishUnordnung bereitgestellt .

Ich kann Apache mit der folgenden Konfiguration (Snippet) als einfachen Reverse-Proxy betreiben:

ProxyPass /jellyfish http://app-server:8181/jellyfish
ProxyPassReverse / http://app-server:8181/

... aber dazu muss die URL des Browsers enthalten sein, jellyfishund wenn Sie zur Root-URL ( http://web-server) gehen, wird 404 Not Found angezeigt .

Ich habe viel Zeit damit verbracht, mod_rewritemit und ohne [P]Flag zu arbeiten, um dies zu umgehen, aber ohne Erfolg. Ich habe es dann mit der ProxyPassMatchDirektive versucht , aber ich kann es auch nicht ganz richtig machen.

Hier ist die aktuelle Konfiguration, wie sie /etc/apache2/sites-available/auf dem Webserver geladen ist . Beachten Sie, dass es ein lokal gehostetes Image-Verzeichnis gibt. Ich habe auch den mod_rewrite-Proxy-Exploit-Schutz beibehalten und unterdrücke ein paar mod_securityRegeln, die falsch positive Ergebnisse lieferten.

<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>

Wenn ich zu gehe http://web-server, werde ich umgeleitet, http://web-server/jellyfish/homeaber dies gibt eine 404 mit einer Beschwerde über den Versuch des Zugriffs /jellyfish/jellyfish/home- Hinweis: Die Adressleiste des Browsers enthält nicht das Doppelte /jellyfish.

HTTP ERROR 404

Problem accessing /jellyfish/jellyfish/home. Reason:

    Not Found

Und wenn ich zu gehe http://web-server/login, werde ich weitergeleitet, http://web-server/jellyfish/login?0aber dies ergibt eine 404, mit der Beschwerde , dass ich versucht habe, auf sie zuzugreifen /jellyfish/jellyfish/login.

HTTP ERROR 404

Problem accessing /jellyfish/jellyfish/login. Reason:

    Not Found

Also, ich schätze, ich bin irgendwie zweimal durch die Regeln gegangen. Ich bin auch ein wenig verwirrt, woher das homeTeil der URL im ersten Beispiel stammt.

Kann mich bitte jemand in die richtige Richtung weisen?

Danke, J.

Jeremy Gooch
quelle
Ich habe diesbezüglich einige Fortschritte erzielt und diese nun durch ProxyPassMatcheine äquivalente Verwendung ersetzt mod_rewrite, die der Herausforderung des Entfernens jellyfishaus den URLs begegnet. Ich untersuche jetzt eine Reihe von 404s, die dann in Bezug auf die zugrunde liegenden Elemente, wie die von Karaf benötigten Wicket-Komponenten, auftauchen. Hier ist ein Code-Schnipsel:# 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

Antworten:

10

So habe ich es zum Laufen gebracht. Neben die Änderungen gemäß meinem Kommentar zu meiner ursprünglichen Frage, die ich brauchte , um auszuschließen , .jsund .cssvon der Regel , dass ein Schrägstrich hinzugefügt.

<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
quelle
1

Hast du es versucht:

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

Oder noch einfacher:

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

Ich habe geschrieben, wie ich mit Apache-Reverse-Proxying und Tomcat umgehe , wenn Sie vergleichen / kontrastieren möchten, was Sie mit dem einrichten, was ich verwende.

Vielleicht möchten Sie dies hinzufügen, um der URL einen abschließenden Schrägstrich hinzuzufügen:

# Settings for adding a trailing slash to the URL
RewriteEngine On
RewriteCond %{REQUEST_URI} ^/$
RewriteRule ^(.*)$ http://%{HTTP_HOST}$1/ [R=301,L]
JakeGould
quelle
Vielen Dank für die Antwort. Leider wird hierdurch nur der unkomplizierte Proxy-Teil des Problems behoben. Das bisschen, das mir fehlt, ist, wie man das Wort "Qualle" aus der Sichtbarkeit in der Adressleiste des Client-Browsers entfernt, so dass es http://web-serverstillschweigend zu http://app-server:8181/jellyfishund zurück weitergeleitet wird.
Jeremy Gooch