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
ProxyPassReverse
funktioniert 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_html
bei 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/app
hat 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.