我正在玩一点 Play!2.0.2。
我的项目是新项目,我唯一更改的是 views/ 目录中的 HTML 和 public/ 目录中的 main.css 文件。
问题是即使我对 CSS 文件进行了修改,应用程序仍然会以 304 Not Modified 响应。Ctrl+R 和 F5 不能解决问题。真正刷新页面的唯一方法是进入浏览器的设置并清除缓存。然后 CSS 将更新,但仅针对下一个请求。
玩!似乎认为 public/ 目录中的每个文件都没有变化,即使情况并非如此。
你知道如何解决这个问题吗?
我正在玩一点 Play!2.0.2。
我的项目是新项目,我唯一更改的是 views/ 目录中的 HTML 和 public/ 目录中的 main.css 文件。
问题是即使我对 CSS 文件进行了修改,应用程序仍然会以 304 Not Modified 响应。Ctrl+R 和 F5 不能解决问题。真正刷新页面的唯一方法是进入浏览器的设置并清除缓存。然后 CSS 将更新,但仅针对下一个请求。
玩!似乎认为 public/ 目录中的每个文件都没有变化,即使情况并非如此。
你知道如何解决这个问题吗?
这是相当合适的情况,每次从服务器刷新页面后都不会下载 CSS 文件。
在浏览器中查找键盘组合,用于重新加载页面并刷新开发周期的缓存(通常是Shift + F5或Shift + 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 的数据库仅存储路径。
根据: 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"