9

我已经使用 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

4 回答 4

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也报告了这个问题

于 2013-04-09T20:01:12.153 回答
0

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

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

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

于 2014-09-23T12:56:41.957 回答
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 命令(但我不记得了)

于 2013-01-08T12:53:21.650 回答
0

jjhavokk 的答案有效,但对于图形,您需要通过 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

于 2017-06-20T09:05:34.740 回答