Play Framework中资产的相对路径

时间:2015-02-17 12:09:05

标签: nginx playframework playframework-2.0

我在nginx后面运行两个Play 2.3.x应用程序。在nginx中,应用程序A配置为在" /"处访问。应用程序B配置为在" / appB /"处访问。

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

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

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

4 个答案:

答案 0 :(得分:1)

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

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

或者,为了确保删除的内容只是一个主要的斜杠,您可以使用stripPrefix

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

答案 1 :(得分:0)

尝试这样的事情: 对于您的应用程序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的路径)。

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

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

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