3

我们试图强制客户端的浏览器在静态文件更改时重新加载它们。目前,我们的构建脚本会自动使用构建时间戳创建一个新目录,并将代码中的内容替换为指向该目录。

但是,我觉得这几乎不是最佳解决方案。如果存在新构建,即使只有一个文件更改,它也会强制客户端浏览器加载每个文件,并且通过扫描每个文件并替换每个静态文件引用,构建时间会大大增加。

我知道我们也可以在声明文件时设置版本(例如 <link src="blahblah.css?version=1.1" />),但这迫使我们更改所有代码以包含版本占位符并且仍然拥有我们的构建脚本替换它。

有没有更聪明的方法来做到这一点?我们正在使用 Spring MVC。mvc:resources 中是否有我不知道在不更改代码的情况下执行此操作的选项?或者 web.xml 上的东西?

我们正在使用tomcat。有没有办法在服务器级别做到这一点?使用 Varnish 之类的缓存会有所帮助吗?或者这些缓存只允许设置到期时间而不检查文件是否更改?请记住,我对服务器和缓存配置任务一点也不满意。

我发现了这个项目https://code.google.com/p/modpagespeed/,但由于它远离我的舒适区,我很难理解功能以及这是否有助于我想要的东西。

有人有什么想法吗?谢谢

4

2 回答 2

2

您可以使用 version 作为查询参数,例如/resources/foo.js?_version=1.0.0. 如果您使用的是 Maven,那么从/META-INF/maven/{groupId}/{artifactId}/pom.properties. 当然,这将强制使用每个新版本重新加载所有脚本......但新版本可能不会经常部署。

那么正确设置 HTTP 缓存标头始终是一个好习惯。<mvc:resources>应该为您正确处理Last-Modified标题。您可以设置cache-period让浏览器更频繁地检查资源修改。

于 2014-08-27T18:09:38.707 回答
1

这是一个可行的解决方案:CorrectBrowserCacheHandlerFilter.java

基本上,当您的浏览器请求静态文件时,服务器会将每个请求重定向到同一个请求,但带有一个哈希查询参数(?v=azErT例如),该参数取决于目标静态文件的内容。

这样做,浏览器将永远不会缓存在您index.html的示例中声明的静态文件(因为总是会收到 a 302 Moved Temporarily),而只会缓存具有哈希版本的文件(服务器会回答200它们)。因此浏览器缓存将有效地用于那些具有哈希版本的静态文件。

免责声明:我是CorrectBrowserCacheHandlerFilter.java.

于 2016-12-13T15:57:34.883 回答