jsf资源通过ajp连接器正确解析

时间:2015-10-20 12:54:58

标签: tomcat jsf-2 primefaces ajp mod-proxy-ajp

我在JSF2中有应用程序(使用Primefaces)。我使用h:outputStylesheet将资源解析为资源,因此指向我的css的链接如下:

/project/javax.faces.resource/style.css.xhtml?ln=css

当我在服务器上的tomcat上部署项目时,一切正常。当我把网址放在broswer中时,我可以看到我的css文件:

http://myserver.com:8080/project/javax.faces.resource/style.css.xhtml?ln=css

当然我也可以使用直接网址来访问它,例如:

http://myserver.com:8080/project/resources/css/style.css

当我配置apache以将来自端口80的请求转发到tomcat时,问题就开始了。我尝试了两个方法:

  • ajp with mod_jk
  • ajp with mod_proxy

当作为jsf资源访问时,两个配置都会生成无效的css文件。当我把:

http://myserver.com/project/javax.faces.resource/style.css.xhtml?ln=css

我收到以下错误消息:

This page contains the following errors:
error on line 1 at column 1: Document is empty
Below is a rendering of the page up to the first error.

但是,我的css文件的直接网址仍然有效:

http://myserver.com/project/resources/css/style.css

我的问题是:我在ajp配置中遗漏了什么?

这里是配置:

ajp工人:

worker.list=ajp13_worker
worker.ajp13_worker.port=8009
worker.ajp13_worker.host=localhost
worker.ajp13_worker.type=ajp13

使用JK的ajp连接:

JkMount /project/ ajp13_worker
JkMount /project ajp13_worker
JkMount /project/* ajp13_worker

使用代理的替代ajp连接:

ProxyPass /project/ ajp://127.0.0.1:8009/project/
ProxyPassReverse /project/ http://127.0.0.1:80/project/

tomcat server.xml

<Connector port="8009"  enableLookups="false" protocol="AJP/1.3" redirectPort="8443" />

我用:

  • Tomcat 7
  • Java 8
  • Primefaces 4.0

1 个答案:

答案 0 :(得分:2)

问题是,正如BalusC所提到的,apache将内容类型设置为application/xhtml+xml,它应该是text/css。设置了xml类型,因为apache中的mod_mime模块已打开。最简单的解决方案是删除xhtml的文件扩展名和内容类型之间的映射。这可以通过添加:

来完成
RemoveType xhtml
在pache config中

行。

可在此处找到更多解决方案:https://serverfault.com/questions/544723/how-to-set-different-mod-mime-rules-for-reverse-proxy