我正在使用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工作)。有什么想法吗?
答案 0 :(得分:0)
在反向代理中重写您的请求可能更容易,也更灵活,而不是更改应用程序中的路径。 apache docs使用mod_rewrite
向您展示如何执行此操作。它可以像
RewriteRule "^/subfolder/(.*)" "http://playapp.example.com/$1" [P]
答案 1 :(得分:0)
我无法弄清楚上面的问题,显然从localhost:9000 /子文件夹本地提供资源显然更容易。
所以基本上我只是将所有资产更改为指向该目录,而不是本地和生产中使用apache中的代理重定向进行localhost:9000 /子文件夹到website.com/subfolder