首页 文章

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

提问于
浏览
126

来自RFC 2616

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

no-cache如果no-cache指令没有指定字段名,那么缓存绝不能使用响应来满足后续请求,而不能成功重新验证源服务器 . 这允许源服务器甚至通过已配置为返回对客户端请求的陈旧响应的缓存来防止缓存 .

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

比较这个

must-revalidate当一个缓存接收到的响应中存在must-revalidate指令时,该缓存必须在该条目变为陈旧后才能响应后续请求而不首先使用源服务器重新验证它

因此,它指示代理重新验证陈旧的响应 .

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

如果有 must-revalidatemax-ageno-cache 有什么意义?

看到这个评论:

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

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

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

更新

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

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

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

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

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

所以 must-revalidate 的意思是当它变为陈旧时强制'bypass cache',这只能在您设置了生命周期/年龄时发生,因此如果在没有年龄或其他 Headers 的响应上设置 must-revalidate ,它实际上等同于 no-cache ,因为响应将立即被视为陈旧 .

  • 所以我要终于标记Gili的答案了!

4 回答

  • 145

    我相信 must-revalidate 的意思是"once the cache expires, refuse to return stale responses to the user even if they say that stale responses are acceptable" . 而 no-cache 暗示 must-revalidate 加上反应变得陈旧的事实 .

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

    至少,这是我的解释 .

  • 8

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

  • 15

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

  • 0

    我认为 max-age=0, must-revalidateno-cache 之间存在差异:

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

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

相关问题