在apache代理后面播放应用程序,子uri不工作

时间:2015-11-21 16:31:04

标签: apache playframework proxy

我在Apache反向代理后面部署Play 2.3应用程序时遇到了一些麻烦。在这种特殊情况下,必须在子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”
  3. 这是我主持的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>
    

    以下是关于proxying / subUri的播放应用程序的一部分

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

    有谁知道该怎么办?提前谢谢!

1 个答案:

答案 0 :(得分: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:

我终于设法只使用一个代理,而不更改资产&#39;位置。

以下是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标记。