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
一起发布
我运行正在 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
一起发布