Play Framework 中资产的相对路径

Relative paths for assets in Play Framework

我运行正在 nginx 后面安装两个 Play 2.3.x 应用程序。在nginx中,应用程序A被配置为在“/”访问。应用程序 B 配置为在“/appB/”访问。

在使用内置的 routes/assets 功能(<script src="@routes.Assets.at("someScriptfile.js")") type="text/javascript"></script> 时,我在解决应用程序 B 的资产问题时遇到了一些问题(<script src="@routes.Assets.at("someScriptfile.js")") type="text/javascript"></script>。这里的问题是 URL 将是绝对的,因为示例 /assets/file.png。这将导致代理将请求转发给应用程序 A。

我想改用亲戚路径。这将允许我 运行 使用和不使用代理的应用程序 B。我希望资产 url 为 assets/file.png

我有哪些选择?我知道我可以通过在代理中使用内容重写来解决它,但我们会

尝试这样的事情: 对于您的应用程序 B,请使用绝对 URL,但在它们前面加上“/appB/”

package misc;

import controllers.routes;

public class BAssets {

    public static String at(String path) {
        return "/appB" + routes.Assets.at(path).toString();
    }
}

然后每次你想为应用程序B提供一些资产,你会这样写:

<script src="@misc.BAssets.at("javascripts/hello.js")"></script>

如果需要,您甚至可以在计算资产路径的方法中包含更多逻辑 - 例如,根据您的应用程序是处于开发模式还是处于生产模式。或者甚至基于代理配置(您可以决定明天更改到 appC 的路径)。

Assets.at returns a Call,在Scala中隐式转换为a String。它产生的 String 只是反向路由器解析到的 URL。如果您只想删除前导斜杠,则可以 drop 第一个字符。

@routes.Assets.at("someScriptfile.js")").drop(1)

或者为了确保删除的只是一个前导斜杠,您可以使用 stripPrefix.

@routes.Assets.at("someScriptfile.js")").stripPrefix("/")

我刚刚找到了一个有效的解决方案。

编辑 application.conf 并添加以下内容:application.context="/appB/"。 这会将 <script src="@routes.Assets.at("someScriptfile.js")" type="text/javascript"></script> 翻译成 url /appB/assets/someScriptfile.js

我刚刚创建了一个 PR 以将相对路径添加到 Play。看起来它将与 2.6.7

一起发布

https://github.com/playframework/playframework/pull/7839