Ósc*_*car 4 caching http no-cache cache-control http-caching
我们有几个文件通过HTTP提供,并且不时更改.
哪些是与缓存相关的HTTP标头,我们应该在HTTP响应中返回以优化浏览器加载速度,同时强制浏览器验证它是否具有文件的最新版本?
我们已经设置了一个"Expires"标题,其中包含过去的日期(此时似乎已达成共识).
但是有些人建议设置这个标题:
Cache-Control: no-cache, no-store, must-revalidate
Run Code Online (Sandbox Code Playgroud)
但是这个标题的问题在于它阻止浏览器保留文件的本地副本,因此每次使用200响应代码下载文件,即使它没有更改.
如果我只是使用:
Cache-Control: no-cache
Run Code Online (Sandbox Code Playgroud)
然后浏览器(至少Firefox 14和Chrome 20)保留本地副本,发送If-Modified-Since和If-None-Match标题,服务器返回304代码并且不下载文件内容. 这是可以随时更改的这些文件的最佳行为.
问题是我不知道设置"no-cache"是否足以强制所有浏览器(包括旧的但仍然使用的版本)和代理服务器使用服务器重新验证其本地缓存副本.
最后,Pragma: no-cache标题怎么样?它应该也包含在HTTP响应中吗?
Google开发人员文档提供了很好的缓存文档,并提供了一些很好用的模式.
例如,它有一个用于定义最佳缓存控制策略的流程图.

此外,它定义了一个很好的模式,可以将指纹添加到文件中,并设置较长时间(如一年)的过期时间.
- 在资源"过期"之前使用本地缓存的响应
- 在URL中嵌入文件内容指纹使我们能够强制客户端更新到新版本的响应
- 每个应用程序都需要定义自己的缓存层次结构以获得最佳性

定义每资源缓存策略的能力允许我们定义"缓存层次结构",这使我们不仅可以控制每个缓存的时间长度,还可以控制访问者看到新版本的速度.例如,让我们分析上面的例子:
- HTML标记为"no-cache",这意味着浏览器将始终在每个请求上重新验证文档,并在内容更改时获取最新版本.此外,在HTML标记中,我们在CSS和JavaScript资源的URL中嵌入指纹:如果这些文件的内容发生更改,则页面的HTML也将更改,并且将下载HTML响应的新副本.
- 允许CSS由浏览器和中间缓存(例如CDN)缓存,并且设置为在1年后到期.请注意,我们可以
安全地使用1年的"远期未来",因为我们将文件
指纹嵌入其文件名:如果CSS更新,URL也会更改
.- JavaScript也设置为在1年后过期,但标记为私有,可能是因为它包含
CDN不应缓存的一些私有用户数据.- 图像在没有版本或唯一指纹的情况下进行缓存,并设置为在1天后过期.
ETag,Cache-Control和唯一URL的组合使我们能够提供最好的世界:长期的到期时间,控制缓存响应的位置,以及按需更新
小智 1
最好的方法(也许不能100%满足您的需求)是:
Cache-Control:max-age=315360000, public
Expires:Tue, 23 Aug 2022 10:53:13 GMT
Run Code Online (Sandbox Code Playgroud)
并为文件指定一个“内容相关文件名”,例如 stylesheet_v32.css。一旦内容发生变化,将文件名+引用更改为,浏览器就会获取最新版本。如果文件名保留,浏览器就不需要请求它。
这在所有浏览器中都是安全且一致的。
无论如何,依赖Cache-Control: no-cache浏览器并保存它是我不想做的。