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?0
und 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?0
in der Adressleiste angezeigt und alle nachfolgenden URLs und Inhalte werden mit der Domain des Webservers und ohne jellyfish
Unordnung 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, jellyfish
und wenn Sie zur Root-URL ( http://web-server
) gehen, wird 404 Not Found angezeigt .
Ich habe viel Zeit damit verbracht, mod_rewrite
mit und ohne [P]
Flag zu arbeiten, um dies zu umgehen, aber ohne Erfolg. Ich habe es dann mit der ProxyPassMatch
Direktive 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_security
Regeln, 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/home
aber 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?0
aber 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 home
Teil der URL im ersten Beispiel stammt.
Kann mich bitte jemand in die richtige Richtung weisen?
Danke, J.
ProxyPassMatch
eine äquivalente Verwendung ersetztmod_rewrite
, die der Herausforderung des Entfernensjellyfish
aus 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/