java - 如何定义要从生产中的不同子目录提供服务的 Play Assets 和 API?

标签 java apache scala .htaccess playframework-2.0

我正在使用 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/

相关文章:

javascript - 你如何使用 frida Hook 原生剥离库?

scala - 函数等于 Scala 中函数的默认值

java - 字符串格式参数在 android 上的 string.xml 中不起作用

java - WebSphere Liberty Profile Verbose Class Logging - 它的输出在哪里?

java - 将元素插入四叉树时出现无限 while 循环问题

python - Apache 下的 webapp2(= 没有 Google App Engine)

apache - 设置 2 个 Play 框架实例的负载均衡器

Apache2 -> Tomcat 虚拟主机

scala - 如何识别远程 Actor ?

java - 如何在 Spark (Scala) 中合并 2 个数据帧?