Reverse-Proxy für virtuellen Host von Apache2: Asset-Links neu schreiben

Reverse-Proxy für virtuellen Host von Apache2: Asset-Links neu schreiben

Auf meinem Server läuft eine Webanwendung auf Port 8080: myip:8080/app

Ich habe die folgende Konfiguration in meiner httpd.conf

<VirtualHost *:80>
 ServerName subdomain.mydomain.com
 ServerAlias mydomain.com
 ProxyPass /app http://localhost:8080/app/
 ProxyPassReverse /app http://localhost:8080/app/
</VirtualHost>

Dies funktioniert einwandfrei und macht die App unter subdomain.mydomain.com/app verfügbar

Jetzt habe ich Probleme, es unter subdomain.mydomain.com verfügbar zu machen (ohne /app). Ich habe zuerst versucht

<VirtualHost *:80>
 ServerName subdomain.mydomain.com
 ServerAlias mydomain.com
 ProxyPass / http://localhost:8080/app/
 ProxyPassReverse / http://localhost:8080/app/
</VirtualHost>

und fügte hinzu

ProxyHTMLURLMap /app/ /

aber beides scheint nicht zu funktionieren. Die Hauptseite wird geladen, aber alle JavaScript- und CSS-Links verweisen immer noch auf /app/..., was die Haupt-HTML-Seite statt des Assets zurückgibt.

Was übersehe ich? Bin ich auf dem richtigen Weg oder gibt es einen ganz anderen (besseren) Weg, dies zu erreichen?

Die Anwendung ist eine Tapestry-Webanwendung in Tomcat 7 unter Ubuntu 12.04.

Alle Erkenntnisse zur Leistung wären ebenfalls interessant.

Antwort1

ProxyPassReversefunktioniert nur bei HTTP-Headern (z. B. 301-Weiterleitungen).

Um HTML-Rewrite zu aktivieren, müssen Sie es wie folgt aktivieren:

ProxyHTMLEnable On
ProxyHTMLURLMap /app/ /

Moderne Webanwendungen können jedoch anhand der HTTP-Anforderungen von Reverse-Proxys problemlos erkennen, was vor sich geht, und in diesem Fall ist normalerweise keine zusätzliche Optimierung auf Proxy-Ebene erforderlich.

Bedenken Sie, dass mod_proxy_htmlbei der Verarbeitung dieser Anfragen ein gewisser Mehraufwand entsteht.

Antwort2

Giovannis Antwort brachte mich auf den richtigen Weg. Ich musste hinzufügen

ProxyHTMLEnable On

oder genauer (für meine Version von mod_proxy_html) das Äquivalent

SetOutputFilter INFLATE;proxy-html;DEFLATE

Ich habe mich jedoch dazu entschieden, es in Kombination mit einer Neufassung zu verwenden (da ich die Tapestry-Ereignislinks auf keine andere Weise zum Laufen bringen konnte):

<VirtualHost *:80>
 ServerName subdomain.mydomain.com
 ServerAlias mydomain.com
 ProxyRequests Off
 ProxyPreserveHost On
 SetOutputFilter INFLATE;proxy-html;DEFLATE     
 ProxyPass / http://localhost:8080/app/
 ProxyPassReverse / http://localhost:8080/app/
 ProxyHTMLURLMap /app/ /     
 ProxyPassReverseCookiePath /app /
 RewriteEngine on
 RewriteRule ^/app/(.+) /$1 [R,L]
</VirtualHost>

Ich musste auch den Cookie-Pfad () anpassen, ProxyPassReverseCookiePath /app /damit mein Tomcat-Sitzungscookie funktioniert.

Antwort3

Ihre Webanwendung myip:8080/apphat wahrscheinlich viele absolute Pfade in HTML und JS, beginnend mit , /app/...die nicht alle erfasst und umgeschrieben werden können mod_proxy_html.

Ich würde vorschlagen, zunächst zu versuchen, Ihre App unter verschiedenen lokalen URLs wie zum Laufen zu bringen myip:8080/blah. Starten Sie die Entwicklersymbolleiste Ihres Browsers und suchen Sie auf der Registerkarte „Netzwerk“ nach Dateien, die immer noch angefordert werden, /app/...und beheben Sie diese, bis sie unter beiden URLs (/blah und /app) funktionieren.

Das Ziel sollte sein, dass alle Links in Ihrer App relativ sind, d.h. angegeben als

<script type="text/javascript" src="file.js"></script>

statt so etwas

<script type="text/javascript" src="/app/file.js"></script>

Schauen Sie sich auch die<base>Tag für eine Möglichkeit zum Überschreiben der Standard-Basis-URL.

verwandte Informationen