jsf 资源通过 ajp 连接器不正确地解析
jsf resources inproperly resolved via ajp connector
我在 JSF2 中有应用程序(使用 Primefaces)。我使用 h:outputStylesheet
将 url 解析为资源,因此指向我的 css 的链接如下所示:
/project/javax.faces.resource/style.css.xhtml?ln=css
当我在我的服务器 tomcat 上部署项目时,一切正常。当我将 url 放入浏览器时,我可以看到我的 css 文件:
http://myserver.com:8080/project/javax.faces.resource/style.css.xhtml?ln=css
当然,我也可以使用直接 url 访问它来访问资源,例如:
http://myserver.com:8080/project/resources/css/style.css
当我将 apache 配置为将来自端口 80 的请求转发到 tomcat 时,问题就开始了。我尝试了两种方法:
- ajp 与 mod_jk
- ajp 与 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.
但是,直接 url 到我的 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
问题是,正如 BalusC 提到的,apache 将内容类型设置为 application/xhtml+xml
,它应该是 text/css
。 xml 类型已设置,因为 apache 中的 mod_mime 模块已打开。最简单的解决方案是删除 xhtml 的文件扩展名和内容类型之间的映射。这可以通过添加来完成:
RemoveType xhtml
apache 配置中的行。
可以在此处找到更多解决方案:https://serverfault.com/questions/544723/how-to-set-different-mod-mime-rules-for-reverse-proxy
我在 JSF2 中有应用程序(使用 Primefaces)。我使用 h:outputStylesheet
将 url 解析为资源,因此指向我的 css 的链接如下所示:
/project/javax.faces.resource/style.css.xhtml?ln=css
当我在我的服务器 tomcat 上部署项目时,一切正常。当我将 url 放入浏览器时,我可以看到我的 css 文件:
http://myserver.com:8080/project/javax.faces.resource/style.css.xhtml?ln=css
当然,我也可以使用直接 url 访问它来访问资源,例如:
http://myserver.com:8080/project/resources/css/style.css
当我将 apache 配置为将来自端口 80 的请求转发到 tomcat 时,问题就开始了。我尝试了两种方法:
- ajp 与 mod_jk
- ajp 与 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.
但是,直接 url 到我的 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
问题是,正如 BalusC 提到的,apache 将内容类型设置为 application/xhtml+xml
,它应该是 text/css
。 xml 类型已设置,因为 apache 中的 mod_mime 模块已打开。最简单的解决方案是删除 xhtml 的文件扩展名和内容类型之间的映射。这可以通过添加来完成:
RemoveType xhtml
apache 配置中的行。
可以在此处找到更多解决方案:https://serverfault.com/questions/544723/how-to-set-different-mod-mime-rules-for-reverse-proxy