2012-10-30 50 views
7

Ich habe eine Anwendung mit PrimeFaces erstellt und möchte das hinter einem Apache Reverse Proxy ausführen.Wie läuft PrimeFaces hinter Reverse-Proxy in einer Subdomain?

Meine Ziel-URL sieht so aus http://myserverurl.org:8080/myapplication/.

Ich möchte auf die Anwendung über Subdomäne wie diese http://myapplication.myserverurl.org zugreifen.

Ich habe einen Virtualhost in Apache konfiguriert:

<VirtualHost *:80> 
    ServerName myapplication.myserverurl.org 
    ProxyPass/http://myserverurl.org:8080/myapplication/ 
    ProxyPassReverse/http://myserverurl.org:8080/myapplication/ 
</VirtualHost> 

Das ist nicht so gut funktioniert. Ich kann die JSF-Seite sehen, aber es wird kein CSS angewendet usw. Ich kann sehen, dass die erste Anfrage korrekt umgeleitet wird, aber die folgenden Anfragen (um jQuery, CSS, etc. zu laden) sind nicht.

Sie versuchen, auf eine URL wie http://myapplication.myserverurl.org/myapplication/faces/javax.faces.resource/primefaces.js?ln=primefaces zuzugreifen, die offensichtlich falsch ist. Sie dürfen den Pfad /myapplication/ nicht erneut einschließen, da der Proxy bereits auf diesen Pfad umleitet.

Wie kann ich dieses Problem lösen? Ist dies ein PrimeFaces-Problem oder ein Problem mit meiner Reverse-Proxy-Konfiguration?

Antwort

0

Es kann je nach Anwendungsserver anders sein, aber als Hauptregel sollten Sie AJP für die Proxyfunktion verwenden.
Der erste Schritt besteht darin, je nach Betriebssystem ajp-Module zu aktivieren. Ubuntu sieht so aus.

sudo a2enmod proxy proxy_ajp 

Schritt 2, die Proxy-Definition in der conf Apache ändern, um so etwas wie:

ProxyPass/ajp://localhost:8009/myapplication 
ProxyPassReverse/ajp://localhost:8009/myapplication 

Schritt 3 ist es auf dem Anwendungsserver zu ermöglichen. Auch hier hängt es davon ab, welche Sie verwenden. Tomcat hat einen auskommentierten Abschnitt in der server.xml. Glassfish hat ein Kontrollkästchen in der Admin-Konsole und einen asadmin-Befehl (aber ich kann mich nicht erinnern)

4

Verwenden (oder nicht verwenden) AJP hat keine Auswirkungen auf die Behebung dieses spezifischen Problems.

Primefaces verwendet intern eine Kontextpfadvariable, um CSS- und JavaScript-Ressourcen einzuschließen. Auch AJP verwenden werden Sie am am Ende mit:

/unwantedAppContext/javax.faces.resource/jquery/jquery.js.jsf?ln=primefaces

Was könnten Sie tun dies einen weiteren Proxy-Pass lösen in den Griff der unerwünschte Kontext. Dies ist möglicherweise nicht die beste Lösung, aber es funktioniert.

<VirtualHost *:80> 

    ServerName myapplication.myserverurl.org 

    ProxyPass /myapplication/ http://myserverurl.org:8080/myapplication/ 
    ProxyPassReverse /myapplication/ http://myserverurl.org:8080/myapplication/ 

    ProxyPass/http://myserverurl.org:8080/myapplication/ 
    ProxyPassReverse/http://myserverurl.org:8080/myapplication/ 
</VirtualHost> 

Die Reihenfolge des Durchgangs ist wichtig.

Dieses Problem wurde auch im Forum http://www.icesoft.org/JForum/posts/list/4433.page#sthash.h1qSqiYg.dpbs ICEfaces berichtet

0

Betrachten ProxyHTMLURLMap Direktive von mod_proxy_html Modul. Dieses Modul manipuliert HTML-Ausgabe-Links, um auf den richtigen Ort zu zeigen. In Ihrem Fall alle Links, die http://myapplication.myserverurl.org/ Notwendigkeit sagen, zurück zu /, das heißt

ProxyHTMLURLMap http://myapplication.myserverurl.org//

Auf diese Weise verändert werden Sie Rückruf Links ändern können, die zu falschen Stelle zeigen.

+0

Dies funktioniert für HTML-Links, aber einige Links werden erzeugt durch clientseitige JS und 'Pr oxyHTMLURLMap' repariert sie nicht. – liadmat

0

Antwort von jjhavokk funktioniert, aber für Grafiken müssen Sie sie über request.contextPath

<img src="#{request.contextPath}/resources/yourfolder/yourpng.png" /> 

Platz es in Webapp/resources/Yourfolder/yourpng.png Mit meiner CSS-Datei verweisen wurde dies nicht erforderlich

h:outputStylesheet name="css/screen.css" 

in Webapp/resources/css