1

我正在实现一个在 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>
4

1 回答 1

0

我认为问题在于您的反向代理规则假设上下文名称 ( 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/

这将使您的 webapp 在https://testapp.xxx.org/testapp/. 如果您不希望 URL 中包含上下文名称部分,则可以将 webapp 部署在 Tomcat root中。

于 2013-09-07T01:10:26.890 回答