【问题标题】:How to run PrimeFaces behind reverse proxy in a subdomain?如何在子域中的反向代理后面运行 PrimeFaces?
【发布时间】:2012-10-19 19:28:55
【问题描述】:

我已经使用 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 问题还是我的反向代理配置有问题?

【问题讨论】:

    标签: apache jsf-2 primefaces subdomain reverse-proxy


    【解决方案1】:

    使用(或不使用)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

    【讨论】:

      【解决方案2】:

      可能会因应用服务器而异,但作为主要规则,您应该使用 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 命令(但我不记得了)

      【讨论】:

        【解决方案3】:

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

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

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

        【讨论】:

        • 这适用于 HTML 链接,但有些链接是通过客户端 JS 生成的,ProxyHTMLURLMap 无法修复它们。
        【解决方案4】:

        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 中

        【讨论】:

          猜你喜欢
          • 2023-03-25
          • 1970-01-01
          • 2016-05-05
          • 1970-01-01
          • 2022-06-13
          • 1970-01-01
          • 2018-03-12
          • 2021-07-15
          • 1970-01-01
          相关资源
          最近更新 更多