it-swarm.com.de

Umschreiben der Apache-URL im Reverse-Proxy

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

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

Wenn Sie bei ausgeschalteter Firewall auf diese URL klicken, lädt Jetty die Anmeldeseite. Die Adressleiste des Browsers ändert sich korrekt in http://app-server:8181/jellyfish/login?0 Und alles funktioniert.

Ich möchte, dass http://web-server (D. H. Vom Stammverzeichnis) Jetty auf dem App-Server zugeordnet wird, wobei der Name der App (jellyfish) unterdrückt wird. z.B. Der Browser würde sich ändern und http://web-server/login?0 In der Adressleiste anzeigen, und alle nachfolgenden URLs und Inhalte würden mit der Domain des Webservers und ohne die Unordnung jellyfish bereitgestellt.

Ich kann Apache mithilfe der folgenden Konfiguration (Snippet) als einfachen Reverse-Proxy verwenden: -

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

... aber dies erfordert, dass die URL des Browsers jellyfish enthält, und wenn Sie zur Stamm-URL (http://web-server) gehen, erhalten Sie eine 404 Not Found.

Ich habe viel Zeit damit verbracht, mod_rewrite Mit und ohne das Flag [P] Zu verwenden, um dies zu umgehen, aber ohne Erfolg. Ich habe dann die Anweisung ProxyPassMatch ausprobiert, aber ich kann das auch nicht ganz richtig verstehen.

Hier ist die aktuelle Konfiguration, die in /etc/Apache2/sites-available/ Auf dem Webserver geladen wird. Beachten Sie, dass es ein lokal gehostetes Bilderverzeichnis gibt. Ich habe auch den mod_rewrite Proxy Exploit Protection beibehalten und unterdrücke ein paar mod_security Regeln, die falsch positive Ergebnisse liefern.

<VirtualHost *:80>
    ServerAdmin [email protected]
    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 http://web-server Gehe, werde ich zu http://web-server/jellyfish/home Weitergeleitet, aber dies ergibt eine 404 mit einer Beschwerde über den Versuch, auf /jellyfish/jellyfish/home - NB = 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 http://web-server/login Gehe, werde ich zu http://web-server/jellyfish/login?0 Weitergeleitet, aber dies ergibt eine 404 mit einer Beschwerde über den Versuch, auf /jellyfish/jellyfish/login Zuzugreifen.

HTTP ERROR 404

Problem accessing /jellyfish/jellyfish/login. Reason:

    Not Found

Ich schätze, ich gehe die Regeln irgendwie zweimal durch. Ich bin auch etwas verwirrt darüber, woher das home -Bit der URL im ersten Beispiel stammt.

Kann mich bitte jemand in die richtige Richtung weisen?

Danke, J.

12
Jeremy Gooch

So habe ich es zum Laufen gebracht. Neben den Änderungen gemäß meinem Kommentar zu meiner ursprünglichen Frage musste ich .js und .css aus der Regel, die einen abschließenden Schrägstrich hinzugefügt hat.

<VirtualHost *:80>
    ServerAdmin [email protected]
    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>
10
Jeremy Gooch

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 Proxy und Tomcat umgehe hier wenn Sie vergleichen/kontrastieren möchten, was Sie mit dem, was ich verwende, einrichten.

Möglicherweise 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]
1
JakeGould