【问题标题】:Play Application behind apache Proxy with sub-uri not working在 apache 代理后面播放应用程序,子 uri 不工作
【发布时间】:2015-11-21 16:31:03
【问题描述】:

我在 Apache 反向代理后面部署 Play 2.3 应用程序时遇到了一些问题。在这种特殊情况下,必须在 sub-uri 下并通过 SSL 访问应用程序。简而言之,这就是我想要做的:

  • 使用 Apache 2.2 作为应用程序的反向代理和 SSL 端点(Apache 和 Play 之间的连接未使用 SSL)
  • 在名为“/playtool”的子 uri 下运行应用程序

例如,当我输入“https://server.tld/playtool”时,我想访问播放应用程序的根目录。 但是,这不起作用:

  1. 所有资产都丢失了,因为 play 将它们的路径生成为“/assets/*”
  2. 虽然我可以访问应用程序的根目录,但其他路由不起作用,因为它们不使用子 uri:例如他们指的是“server.tld/page”而不是“server.tld/playtool/page”

这是该主机的 Apache 配置:

    <IfModule mod_proxy.c>
            ProxyPreserveHost on
            ProxyRequests Off
            <Proxy *>
                   Order deny,allow
                    Allow from all
            </Proxy>
            ProxyPass /playtool http://127.0.0.1:9000 retry=0
            ProxyPassReverse /playtool http://127.0.0.1:9000 retry=0
    </IfModule>

这是 play 应用程序中关于代理/subUri 的部分

   application.baseUrl="https://server.tld"
   XForwardedSupport=127.0.0.1
   XForwardedProto=https
   XForwardedSupport=127.0.0.1
   http.path="/playtool"

有人知道该怎么做吗?提前致谢!

【问题讨论】:

    标签: apache playframework proxy


    【解决方案1】:

    以下几点可能会有所帮助。

    我仍在寻找一种在相对 URL 下生成资产的方法,但可以设置绝对 URL,以允许 Apache 服务器重定向调用。

    如果您的页面位于/playtool 下,那么您可以更改您的播放应用程序配置以将所有资产指向/play/assets 而不是简单的/assets。通过这种方式,您可以识别每个应用程序的资产,并确保只重定向您需要的资产。

    GET   /play/assets/*file     controllers.Assets.versioned(path="/public", file: Asset)
    

    这将允许您重定向到这些资产,如下所示:

    RewriteEngine On
    RewriteRule ^/play/assets/(.*)$ https://server.tld/playtool/play/assets/$1 [R]
    

    关于您的其他问题 - 链接不起作用。这很容易解决。您只需要没有绝对链接(不是以/ 开头)并且必须定义基本HTML 标记。有关标签的更多信息,请参阅http://www.w3schools.com/tags/tag_base.asp

    那么你可以有以下:

    <base href="/playtool/">
    

    希望这会有所帮助。我本人对资产重定向解决方案并不是很满意,所以如果您已经找到了更好的处理方法,请告诉我。

    编辑:

    您可以代替为/play 下的所有内容重定向另一个代理。像这样的:

    <Location /play>
        ProxyPass http://127.0.0.1:9000/play
        ProxyPassReverse http://127.0.0.1:9000/play
    </Location>
    

    编辑 2:

    我终于设法只使用一个代理来做到这一点,而无需更改资产的位置。

    这是 Apache 端的代理配置:

    <LocationMatch ^\/playtool\/?(.*)$>
        ProxyPass http://127.0.0.1:9000/playtool/$1
        ProxyPassReverse http://127.0.0.1:9000/playtool/$1
        SetOutputFilter DEFLATE
    </LocationMatch>
    

    然后在 Play 端,您需要添加 play.http.context,以设置您的应用程序上下文。

    play.http.context="/playtool/"
    

    当然,您还需要配置基本 HTML 标记。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-24
      • 2018-01-09
      • 2017-07-19
      相关资源
      最近更新 更多