我已经使用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问题还是我的反向代理配置问题?
答案 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
中