2012-10-30 33 views
7

我已經用PrimeFaces構建了一個應用程序,並希望在apache反向代理之後運行該應用程序。如何在子域中的逆向代理後面運行PrimeFaces?

我的目標網址是這樣的http://myserverurl.org:8080/myapplication/

我想要像這樣通過子域訪問應用程序http://myapplication.myserverurl.org

我在Apache的配置了虛擬主機:

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

這工作不是那麼好。我可以看到JSF頁面,但沒有應用CSS等。我可以看到第一個請求被正確重定向,但以下請求(加載jQuery,CSS等)不是。

他們嘗試訪問一個url,如http://myapplication.myserverurl.org/myapplication/faces/javax.faces.resource/primefaces.js?ln=primefaces,這顯然是錯誤的。它們不能再包含/myapplication/路徑,因爲代理已經重定向到該路徑。

我該如何解決這個問題?這是PrimeFaces問題還是我的反向代理配置問題?

回答

0

根據應用程序服務器的不同,它可能有所不同,但作爲主要規則,您應該使用AJP進行代理。
第一步是根據操作系統啓用ajp模塊。 Ubuntu看起來像這樣。

sudo a2enmod proxy proxy_ajp 

第2步,在apache的conf代理定義更改爲類似:

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

第3步是使它的應用程序服務器上。再次,它取決於你使用的那個。 Tomcat在server.xml中有註釋部分。 Glassfish在管理控制檯中有一個複選框和一個asadmin命令(但我不記得它)

4

使用(或不使用)AJP對解決此特定問題沒有任何影響。

Primefaces在內部使用上下文路徑變量來包含CSS和Javascript資源。即使使用AJP你將結束:

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

,你可以做些什麼來解決這個添加其他代理通處理不需要的上下文。這可能不是最好的解決方案,但它可行。

<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> 

通關的順序事項。

這個問題也報告了ICEfaces的論壇 http://www.icesoft.org/JForum/posts/list/4433.page#sthash.h1qSqiYg.dpbs

0

考慮使用從mod_proxy_html模塊ProxyHTMLURLMap指令。該模塊將輸出HTML鏈接操作爲指向正確的位置。在你的情況都告訴http://myapplication.myserverurl.org/需要的鏈接,改回/,即

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

這種方式,您可以修改都指向錯誤的位置的任何回撥鏈接。

+0

這適用於HTML鏈接,但有些鏈接是通過客戶端JS和'鐠產生oxyHTMLURLMap'不能解決它們。 – liadmat

0

jjhavokk作品的答案,但 的圖形,你需要通過request.contextPath引用它們

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

將其放置在Web應用程序/資源/ yourfolder/yourpng.png 用我的.css文件這是沒有必要

h:outputStylesheet name="css/screen.css" 
在web應用程序/資源/ CSS