如何定义要从生产中的其他子目录提供的Play资源和API?

时间:2016-08-21 08:08:32

标签: java apache scala .htaccess playframework-2.0

我正在使用Play 2 Framework。如果我没有使用版本化资产,那么所有资产都在本地正确呈现(但不是生产)。

我要求从localhost:9000/assets/*提供本地资产,但在生产中,资产将从www.domain.com/subfolder/assets/*提供

我还需要确保在生产中以类似的方式从localhost:9000/api/*www.domain.com/subfolder/api/*提供API。这是因为已经有一个应用程序在www.domain.com上运行,它的资产是使用完全不同的技术(PHP而不是Java / Scala)编写和提供的。

我的游戏路线定义:

# Map static resources from the /public folder to the /assets URL path
GET     /assets/v/*file               controllers.Assets.versioned(path="/public", file: Asset)

资产在header.scala.html文件中加载:

<link rel="stylesheet" href="@routes.Assets.versioned("template/css/bootstrap.css").absoluteURL()" />
<link rel="stylesheet" href="@routes.Assets.versioned("stylesheets/main.css").absoluteURL()" />

我正在footer.scala.html文件中加载js资产,如下所示:

<script src="@routes.Assets.versioned("template/js/jquery.min.js").absoluteURL()"></script>
<script src="@routes.Assets.versioned("template/js/bootstrap.min.js").absoluteURL()"></script>

<script type="text/javascript" src="@routes.Assets.versioned("template/angular/angular.js").absoluteURL()"></script>
<script type="text/javascript"
src="@routes.Assets.versioned("template/angular/angular-animate.js").absoluteURL()"></script>
<script type="text/javascript"
src="@routes.Assets.versioned("template/angular/angular-cookies.js").absoluteURL()"></script>
<script type="text/javascript"
src="@routes.Assets.versioned("template/angular/angular-route.js").absoluteURL()"></script>
<script type="text/javascript"
src="@routes.Assets.versioned("template/angular/angular-resource.js").absoluteURL()"></script>
<script type="text/javascript"
src="@routes.Assets.versioned("template/angular/angular-sanitize.js").absoluteURL()"></script>

<script type="text/javascript" src="@routes.Assets.versioned("javascripts/app.js").absoluteURL()"></script>
<script type="text/javascript"
src="@routes.Assets.versioned("javascripts/appController.js").absoluteURL()"></script>

<script type="text/javascript" src="@routes.Assets.versioned("javascripts/moment.js").absoluteURL()">    </script>

我的播放应用程序使用Apache中的反向代理配置提供,可以从www.domain.com/subfolder正确提供

但是,api和资产仍然需要从www.domain.com加载,而不是www.domain.com/subfolder

如何正确加载资源,以便正确加载开发和生产?

我已查看https://www.playframework.com/documentation/2.5.x/AssetsOverview,因为我说资产已在/assets文件夹中加载到生产中而不是subfolder/assets

非常感谢任何帮助!

更新

我按照Kim的回答所做的尝试了以下内容:

ProxyPreserveHost On
ProxyPass /sportsbook http://127.0.0.1:9000 retry=0
ProxyPassReverse /sportsbook http://127.0.0.1:9000 retry=0

ProxyHTMLEnable Off
ProxyHTMLURLMap http://localhost:9000 /sportsbook
<Location /sportsbook/>
    ProxyPassReverse http://localhost:9000/
    SetOutputFilter proxy-html
    ProxyHTMLURLMap /           /sportsbook/
    ProxyHTMLURLMap /sportsbook            /sportsbook
</Location>

然而,这会破坏主站点(没有css或js工作)。有什么想法吗?

2 个答案:

答案 0 :(得分:0)

在反向代理中重写您的请求可能更容易,也更灵活,而不是更改应用程序中的路径。 apache docs使用mod_rewrite向您展示如何执行此操作。它可以像

一样简单
RewriteRule "^/subfolder/(.*)" "http://playapp.example.com/$1" [P]

答案 1 :(得分:0)

我无法弄清楚上面的问题,显然从localhost:9000 /子文件夹本地提供资源显然更容易。

所以基本上我只是将所有资产更改为指向该目录,而不是本地和生产中使用apache中的代理重定向进行localhost:9000 /子文件夹到website.com/subfolder