我正在使用 Play 2 框架。如果我不使用版本化 Assets ,所有 Assets 都会在本地正确呈现(但不是生产)。
我要求从 localhost:9000/assets/*
提供本地资源然而,在生产中, Assets 将从www.domain.com/subfolder/assets/*
提供服务
我还需要确保 API 是从 localhost:9000/api/*
提供的和www.domain.com/subfolder/api/*
在生产中以类似的方式。这是因为 www.domain.com 上已经有一个应用程序正在运行,并且它的 Assets 是使用完全不同的技术(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 在 /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/$1" [P]
关于java - 如何定义要从生产中的不同子目录提供服务的 Play Assets 和 API?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39062167/