如何在子域中的反向代理后面运行PrimeFaces?

时间:2012-10-30 12:48:28

标签: apache jsf-2 primefaces subdomain reverse-proxy

我已经使用PrimeFaces构建了一个应用程序,并希望在apache反向代理之后运行它。

我的目标网址如下http://myserverurl.org:8080/myapplication/

我想通过子域名访问该应用程序,例如http://myapplication.myserverurl.org

我在apache中配置了VirtualHost:

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

效果不太好。我可以看到JSF页面,但没有应用CSS等。我可以看到第一个请求被正确重定向,但是以下请求(加载jQuery,CSS等)不是。

他们尝试访问http://myapplication.myserverurl.org/myapplication/faces/javax.faces.resource/primefaces.js?ln=primefaces这样的网址,这显然是错误的。它们不得再次包含 / myapplication / 路径,因为代理已重定向到该路径。

我该如何解决这个问题?这是PrimeFaces问题还是我的反向代理配置问题?

4 个答案:

答案 0 :(得分:5)

使用(或不使用)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

答案 1 :(得分: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命令(但我不记得了)

答案 2 :(得分:0)

考虑使用mod_proxy_html模块中的ProxyHTMLURLMap指令。此模块操作输出HTML链接以指向正确的位置。在您的情况下,所有指示http://myapplication.myserverurl.org/的链接都需要更改回/,即

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

这样您就可以修改指向错误位置的任何回叫链接。

答案 3 :(得分:0)

jjhavokk的答案有效 对于Graphics,您需要通过request.contextPath

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

将其放在webapp / resources / yourfolder / yourpng.png中 使用我的.css文件,这是不需要的

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

在webapp / resources / css