对于可以更改的内容,哪些是与缓存相关的最佳HTTP标头?

Ó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-SinceIf-None-Match标题,服务器返回304代码并且不下载文件内容. 这是可以随时更改的这些文件的最佳行为.

问题是我不知道设置"no-cache"是否足以强制所有浏览器(包括旧的但仍然使用的版本)和代理服务器使用服务器重新验证其本地缓存副本.

最后,Pragma: no-cache标题怎么样?它应该也包含在HTTP响应中吗?

Nan*_*ana 5

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浏览器并保存它是我不想做的。