211

来自 RFC 2616

http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9.1

无缓存

如果 no-cache 指令未指定字段名称,则缓存不得使用响应来满足后续请求,而无需与源服务器成功重新验证。这允许源服务器阻止缓存,即使缓存已配置为向客户端请求返回陈旧响应。

因此,它指示代理重新验证所有响应。

与此相比

必须重新验证

当缓存接收到的响应中存在 must-revalidate 指令时,该缓存不能在该条目变得陈旧后使用该条目来响应后续请求,而无需首先使用原始服务器重新验证它

因此,它指示代理重新验证过时的响应。

特别是关于no-cache,用户代理实际上是如何经验性地对待这个指令的?

no-cache如果有must-revalidateand有什么意义max-age

看到这个评论:

http://palpapers.plynt.com/issues/2008Jul/cache-control-attributes/

无缓存

虽然这个指令听起来像是在指示浏览器不要缓存页面,但还是有细微的差别。根据 RFC,“no-cache”指令告诉浏览器它应该在从缓存中提供页面之前与服务器重新验证。重新验证是一种巧妙的技术,可以让应用程序节省带宽。如果浏览器缓存的页面没有改变,服务器只是向浏览器发出信号,页面就会从缓存中显示出来。因此,浏览器(至少在理论上)将页面存储在其缓存中,但只有在服务器重新验证后才会显示它。实际上,IE 和 Firefox 已经开始将 no-cache 指令视为指示浏览器甚至不缓存页面。我们大约在一年前开始观察这种行为。

有没有人对此有更官方的消息?

更新

当且仅当未能验证对表示的请求可能导致不正确的操作(例如静默未执行的金融交易)时,服务器才应该使用 must-revalidate 指令。

这是我直到现在才把它放在心上的事情。RFC 说不要轻易使用 must-revalidate。问题是,对于 Web 服务,您必须对未知的客户端应用程序采取负面看法并假设最坏的情况。任何陈旧的资源都有可能导致问题。

我刚刚考虑过的其他事情,没有 Last-Modified 或 ETags,浏览器只能再次获取整个资源。但是,使用 ETags,我观察到 Chrome 至少似乎对每个请求都重新验证。这使得这两个指令都没有实际意义,或者至少命名不佳,因为它们无法正确重新验证,除非请求还包含其他导致“始终重新验证”的标头。

我只是想让最后一点更清楚。通过仅设置must-revalidate但不包括 ETag 或 Last-Modified,代理只能再次获取内容,因为它没有任何内容可发送到服务器进行比较。

但是,我的经验测试表明,当响应中包含 ETag 或修改后的标头数据时,无论must-revalidate标头是否存在,代理总是会重新验证。

所以重点must-revalidate是在它过时时强制“绕过缓存”,这只能在您设置生命周期/年龄时发生,因此如果must-revalidate在没有年龄或其他标头的响应上设置,它实际上等效于no-cache因为响应将立即被视为陈旧。

——所以我要最终标记吉利的答案!

4

5 回答 5

221

我相信这must-revalidate意味着:

一旦缓存过期,即使用户说陈旧的响应是可以接受的,也拒绝向用户返回陈旧的响应。

鉴于no-cache暗示:

must-revalidate再加上响应立即变得陈旧的事实。

如果响应可缓存 10 秒,则must-revalidate在 10 秒后启动,而在 0 秒后no-cache暗示。must-revalidate

至少,这是我的解释。

于 2013-11-12T19:53:15.627 回答
27

max-age=0, must-revalidate并且no-cache不完全相同。使用must-revalidate,如果服务器不响应重新验证请求,则浏览器/代理应该返回 504 错误。使用no-cache,它只会显示缓存的内容,这可能是用户的首选(有一些陈旧的东西总比什么都没有好)。这就是为什么must-revalidate仅适用于关键事务的原因。

于 2016-06-10T06:13:44.563 回答
18

根据 Jeffrey Fox 的解释no-cache,我在 chrome 52.0.2743.116 m 下进行了测试,结果显示与no-cache具有相同的行为,当服务器无法访问时must-revalidate,它们都不会使用本地缓存,并且,它们都会在点击浏览器的返回时使用缓存/服务器无法访问时的转发按钮。如上所述,我认为至少在实现上max-age=0, must-revalidate是相同的。no-cache

于 2016-11-17T07:25:26.173 回答
0

同意@Jeffrey Fox 的部分回答:

max-age=0,must-revalidate 和 no-cache 并不完全相同。

不同意这部分:

使用 no-cache,它只会显示缓存的内容,这可能是用户更喜欢的(有一些陈旧的东西总比什么都没有好)。

cache-control: no-cacheRFC 文档中没有指定当重新验证失败时实现应该做什么。这完全取决于实施。他们可能会抛出 504 错误,cache-control: must-revalidate或者只是从缓存中提供过时的副本。

于 2021-02-17T14:04:25.100 回答
-2

max-age=0, must-revalidate我认为和之间有区别no-cache

在这种must-revalidate情况下,允许客户端发送If-Modified-Since请求并在返回时从缓存304 Not Modified中提供响应。

在这种no-cache情况下,客户端不能缓存响应,所以不应该使用If-Modified-Since.

于 2018-06-22T16:03:53.807 回答