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

How do I define Play assets and APIs to be served from a different sub-directory in production?

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

我要求从 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>

我的 play 应用程序使用 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 工作)。有什么想法吗?

在反向代理中重写请求可能比更改应用程序中的路径更容易、更灵活。 apache docs 向您展示了如何使用 mod_rewrite 做到这一点。它可以像

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

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

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