【问题标题】:Scala/Play/Nginx: static resource routingScala/Play/Nginx:静态资源路由
【发布时间】:2013-11-16 04:51:46
【问题描述】:

我的 Play 应用正在运行:

http://localhost:9000

Nginx 是代理将它传递给这个 url:

http://localhost/Demo/

不过,我对静态资产有疑问。例如,html模板中的这个资产

<link rel="stylesheet" media="screen" href="@routes.Assets.at("stylesheets/main.css")">

要去

http://localhost/assets/stylesheets/main.css

显然导致找不到。如果我把它改成这个(在网址前添加/Demo):

<link rel="stylesheet" media="screen" href="/Demo@routes.Assets.at("stylesheets/main.css")">

它现在会正确地转到这个网址:

http://localhost/Demo/assets/stylesheets/main.css

我的问题是:如何将 /Demo 添加到我的所有静态资产中,而不会将其硬编码到我的模板中?我更喜欢使用 Play 的路由和限制对 nginx conf 所做的更改来解决这个问题。

我尝试像这样在application.conf 中添加 url 前缀

application.context="/Demo"

但这不仅影响了静态网址,还影响了所有网址,因此不是解决方案。有什么想法吗?

我的堆栈: 播放框架 2.2.1 / 斯卡拉 2.10.3 / Java 8 64 位 / Nginx 1.4.3 / Ubuntu 13.10 64位

更新:解决方案感谢 @biesior 提供 Java 版本,我已将其转换为 scala:

package core

import controllers.routes

object Assets {

    def at(path: String): String = {
        "/Demo" + routes.Assets.at(path)
    }

}

【问题讨论】:

  • 你试过GET /Demo/assets/*file Assets.at("public", file)的路线并阅读official documentation吗?
  • @krivachy.akos 是的,是的。将 /Demo 添加到路由会导致所有资产 404。如果我将它附加到模板中,它的唯一工作方式。
  • 没有 nginx 也能用吗?你认为它是特定的吗?我在我的本地 Play 应用程序之一上进行了尝试,效果很好:GET /Demo/assets/*file controllers.Assets.at(path="/public", file)。这意味着我的页面有:&lt;link rel="stylesheet" media="screen" href="@routes.Assets.at("stylesheets/main.css")"&gt; 并导致:&lt;link rel="stylesheet" media="screen" href="/Demo/assets/stylesheets/main.css"&gt;
  • @krivachy.akos 无论我是否添加/Demo(没有变化),它都可以在没有 nginx 的情况下工作,但这不是问题。我需要它在 Nginx 下工作,如果我编辑模板 URL,它确实可以工作 - 我想要的只是一个地方可以做到这一点。

标签: scala nginx playframework routing playframework-2.0


【解决方案1】:

只需使用自己的资产实现覆盖路径(即在utils 包中):

package utils;
import controllers.routes;

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

在模板中:

<img src='@utils.MyAssets.at("images/logo.png")' alt="">

另一方面,目标项目也可以在子目录中工作吗?如果不是这样,使用子域更容易,也可以使用 localhost,只需为该项目配置 nginx 以使用即:http://demo.loc 而不是 http://localhost/Demo 并将此 'domain' 添加到您的hosts文件

【讨论】:

  • 谢谢,这是可行的,不过我已将其转换为 Scala,这就是我在项目中使用的。
  • 使用 Scala 示例与其他人打交道,然后请 ;)
猜你喜欢
  • 2015-06-06
  • 1970-01-01
  • 2018-08-19
  • 1970-01-01
  • 2016-04-22
  • 1970-01-01
  • 2016-04-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多