【问题标题】:JSF 2 / RichFaces 4 webapp with Apache and Tomcat not finding webapp resources library带有 Apache 和 Tomcat 的 JSF 2 / RichFaces 4 webapp 找不到 webapp 资源库
【发布时间】:2013-09-11 03:48:20
【问题描述】:

我正在实现一个在 Tomcat 7 下运行的 JSF2/RichFaces 4 Web 应用程序。我在 Eclipse 下使用 MyEclipse 和 Tomcat 7 开发了它,一切正常。当我将应用程序部署到完整的生产环境时,资源库 images/css/js 文件从 Apache 获取 404。生产环境是带有 SSL 和 mod_proxy 前端 Tomcat 7 的 Apache 2。我怀疑代理设置是错误的,并且当 tomcat webapp 运行时,Apache GET 请求没有被正确代理,但我没有我想我知道的足够明白为什么了。

从顶部开始,这是我的带有代理的 apache 虚拟主机(注意 *:443 用于 ssh):

NameVirtualHost *:443

<VirtualHost *:443>
    ServerName testapp.xxx.org

    SSLEngine on
    SSLProxyEngine on
    SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM:+LOW
    SSLCertificateFile /etc/pki/tls/certs/testapp.xxx.org.crt
    SSLCertificateKeyFile /etc/pki/tls/private/testapp.xxx.org.key

    <Proxy *>
        Order deny,allow
        Allow from all
    </Proxy>

    # Proxy everything to tomcat.
    ProxyPass         /      http://localhost:8080/testapp/
    ProxyPassReverse  /      http://localhost:8080/testapp/
</VirtualHost>

当我转到https://testapp.xxx.org 时,应用程序启动并显示 JSF,但没有 CSS、js 和图像。此类图像资源的 HTML 如下所示,这是正确的(在 Eclipse 下相同):

<img src="/testapp/javax.faces.resource/images/tairlogo.png.xhtml?ln=default" alt="TAIR web site" />

应该从 webapp 上下文根开始并寻找资源库。对应的Apache访问日志GET在这里:

"GET /testapp/javax.faces.resource/images/tairlogo.png.xhtml?ln=default HTTP/1.1" 404 12500

这张图片的实际JSF代码是:

  <h:outputLink value="http://www.arabidopsis.org">
    <h:graphicImage library="default" name="images/tairlogo.png"
      alt="TAIR web site"></h:graphicImage>
  </h:outputLink>

【问题讨论】:

    标签: apache jsf-2 tomcat7


    【解决方案1】:

    我认为问题在于您的反向代理规则假设上下文名称 (testapp) 不存在于 URL 中,而在 HTML 中您假设它存在(如 src 属性你的img 标签)。您应该删除路径和目标 URL 中的上下文名称以将所有内容代理到 Tomcat,例如:

    ProxyPass         /      http://localhost:8080/
    ProxyPassReverse  /      http://localhost:8080/
    

    或者将其保留在两者中以仅将该 webapp 代理到 Tomcat:

    ProxyPass         /testapp/      http://localhost:8080/testapp/
    ProxyPassReverse  /testapp/      http://localhost:8080/testapp/
    

    这将使您的网络应用程序在https://testapp.xxx.org/testapp/ 可用。如果您不希望 URL 中包含上下文名称部分,您可以deploy the webapp in the Tomcat root

    【讨论】:

    • 我将我的应用更改为 ROOT.war(删除了 tomcat/webapps 下的 ROOT 目录),使其成为默认的 webapp。我将反向代理更改为首选,没有“testapp”。一切正常。
    • 不过我很好奇:如果你有 10 个 web 应用程序在 tomcat 下运行,并且有 10 个不同的子域来运行它们,你会怎么做呢?在 JBoss 中,您使用 jboss-web.xml 中定义的虚拟主机来执行此操作。是否有与 tomcat 类似的东西来定义虚拟主机?还是您只需要使用 URL 中的 /webapp 语法?
    • 我从来没有实现过这样的设置,但我相信您必须在 Tomcat 和 Apache 中定义虚拟主机,并为每个虚拟主机设置一个 ProxyPass 规则。见tomcat.apache.org/tomcat-7.0-doc/virtual-hosting-howto.html
    猜你喜欢
    • 2020-06-28
    • 2020-06-14
    • 2014-12-01
    • 2012-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-24
    • 1970-01-01
    相关资源
    最近更新 更多