0

我正在玩一点 Play!2.0.2。

我的项目是新项目,我唯一更改的是 views/ 目录中的 HTML 和 public/ 目录中的 main.css 文件。

问题是即使我对 CSS 文件进行了修改,应用程序仍然会以 304 Not Modified 响应。Ctrl+R 和 F5 不能解决问题。真正刷新页面的唯一方法是进入浏览器的设置并清除缓存。然后 CSS 将更新,但仅针对下一个请求。

玩!似乎认为 public/ 目录中的每个文件都没有变化,即使情况并非如此。

你知道如何解决这个问题吗?

4

2 回答 2

3

这是相当合适的情况,每次从服务器刷新页面后都不会下载 CSS 文件。

在浏览器中查找键盘组合,用于重新加载页面并刷新开发周期的缓存(通常是Shift + F5Shift + Ctrl +R)。

另一个问题是如何告诉 100 万用户在更改实时站点后按下组合:最简单的方法是在 CSS/JS 文件名中添加一个唯一的字符串:

<link rel="stylesheet" href="/assets/css/main/css?12345" />

你可以通过多种方式做到这一点,

  • 首先只需手动添加它,然后在 CSS/JS 中的重要更改也更改?12345?34567所有文件之后

    <link rel="stylesheet" href='@routes.Assets.at("css/main.css")?12345'>
    
  • 第二 - 半自动:使用一些控制器的方法来生成时间戳

    <link href='@routes.Assets.at("css/main.css")?@Application.timestamp()' rel="stylesheet">
    <script src='@routes.Assets.at("js/scripts.js"?@Application.timestamp())' type="text/javascript"></script>
    
  • 并在中创建timestamp()方法Application.java

    public static String timestamp(){
        // here you can add some more control
        // but DON'T set new timestamp each time, 
        // cause you'll make the browser's cache useless
        return "12345";
    }
    
  • 第三种解决方案将是未来实时站点的最佳选择:使用 Application.timestamp() 为每个文件设置自定义时间戳。在这种情况下,您可以在需要时更改/重置它们,而无需重新编译应用程序并将 jars 发送回服务器。当然,在这种情况下,您不应该将 CSS 文件保存在 Play 的public文件夹中,相反,最好使用前端 HTTP 服务器从某个 FTP 位置为它们提供服务,并使用 Play 的数据库仅存储路径。

于 2012-08-20T06:21:56.217 回答
0

根据: http ://www.playframework.com/documentation/2.1.0/Assets

Etag 支持 Assets 控制器自动管理 ETag HTTP 标头。ETag 值是根据资源名称和文件的最后修改日期生成的。(如果资源文件嵌入到文件中,则使用 JAR 文件的最后修改日期。)

当 Web 浏览器发出指定此 Etag 的请求时,服务器可以响应 304 NotModified。

不知何故,这不适用于 css 文件(至少在开发模式下玩 java 2.1)

手动设置缓存超时可能是一个临时解决方案

"assets.cache./public/stylesheets/main.css"="max-age=1"
于 2013-02-28T09:02:33.910 回答