no-cache和must-revalidate之间的区别

时间:2013-08-09 14:19:30

标签: http

来自RFC 2616

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

  

无缓存

     

如果no-cache指令没有指定字段名,则表示缓存   不得使用响应来满足后续请求   使用原始服务器成功重新验证。这允许起源   服务器,以防止缓存,即使是已配置的缓存   返回对客户请求的过时响应。

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

将此与

进行比较
  

必重新验证

     

当收到的响应中存在must-revalidate指令时   通过缓存,该缓存在变为陈旧后不得使用该条目   在没有首先重新验证它的情况下响应后续请求   原始服务器

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

特别是关于no-cache,用户代理实际上是如何根据经验处理此指令的吗?

如果no-cachemust-revalidate max-age有什么意义?

请参阅此评论:

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

  

无缓存

     

虽然这个指令听起来像指示浏览器不这样做   缓存页面,有一个微妙的区别。 “无缓存”指令,   根据RFC,告诉浏览器它应该重新验证   从缓存服务页面之前的服务器。重新验证是一个   整洁的技术,让应用程序保持带宽。如果   浏览器缓存的页面没有改变,服务器只是发出信号   到浏览器,页面从缓存中显示。因此,   浏览器(理论上至少)将页面存储在缓存中,但是   仅在使用服务器重新验证后才显示它。在实践中,IE   和Firefox已经开始将no-cache指令视为一样   指示浏览器甚至不缓存页面。我们开始观察了   大约一年前的这种行为。我们怀疑这种变化是   由于该指令的广泛使用(和不正确的)而引发的   防止缓存。

有没有人在这方面有更多的官方文件?

更新

  

当且仅当无法验证对表示的请求可能导致不正确的操作(例如无声的未执行的金融交易)时,服务器才应使用必须重新验证的指令。

直到现在,这是我从未理解过的事情。 RFC表示不要轻易使用must-revalidate。问题是,对于Web服务,您必须采取负面视图并假设您的未知客户端应用程序最糟糕。任何陈旧的资源都有可能导致问题。

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

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

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

所以must-revalidate的意思是在过时时强制使用'旁路缓存',这只有在你设置了生命周期/年龄时才会发生,因此如果在响应上设置了must-revalidate没有年龄或其他标题,它实际上等同于no-cache,因为响应将立即被视为陈旧。

- 所以我最终要记下吉利的答案!

5 个答案:

答案 0 :(得分:165)

我相信must-revalidate意味着“一旦缓存过期,拒绝向用户返回陈旧的回复,即使他们说陈旧的回复是可接受的”。而no-cache暗示must-revalidate加上事实,响应会立即变得陈旧。

如果响应可缓存10秒,则must-revalidate会在10秒后启动,而no-cache会在0秒后隐含must-revalidate

至少,这是我的解释。

答案 1 :(得分:17)

max-age=0, must-revalidateno-cache并不完全相同。使用must-revalidate,如果服务器未响应重新生效请求,则浏览器/代理应返回504错误。使用no-cache,它只显示缓存的内容,这可能是用户首选的内容(最好是让一些东西过时而不是任何东西)。这就是must-revalidate仅用于关键交易的原因。

答案 2 :(得分:12)

Jeffrey Fox对no-cache的解释,我已经在chrome 52.0.2743.116 m下进行了测试,结果显示no-cachemust-revalidate具有相同的行为,当服务器无法访问时,他们都 NOT 使用本地缓存,并且当服务器无法访问时,他们都会使用缓存,同时点击浏览器的后退/前进按钮。 如上所述,我认为max-age=0, must-revalidateno-cache相同,至少在实施中是这样。

答案 3 :(得分:0)

同意@Jeffrey Fox 的部分回答:

<块引用>

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

不同意这部分:

<块引用>

如果没有缓存,它只会显示缓存的内容,这可能是用户更喜欢的(有一些陈旧的东西总比没有好)。

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

答案 4 :(得分:-1)

我认为max-age=0, must-revalidateno-cache之间是有区别的:

must-revalidate情况下,如果返回If-Modified-Since,则允许客户端发送304 Not Modified请求并提供来自缓存的响应。

no-cache情况下,客户端不得缓存响应,因此不应使用If-Modified-Since