首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >无缓存和必须重新验证之间的区别

无缓存和必须重新验证之间的区别
EN

Stack Overflow用户
提问于 2013-08-09 22:19:30
回答 5查看 145.7K关注 0票数 206

从RFC 2616

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

无缓存

如果no-cache指令未指定字段名,则在未成功与源服务器重新验证的情况下,缓存不得使用响应来满足后续请求。这允许源服务器阻止缓存,即使是通过已配置为向客户端请求返回过时响应的缓存。

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

将其与

必须重新验证

如果高速缓存接收到的响应中存在MUST revalidate指令,则该高速缓存不得在条目过期后使用该条目来响应后续请求,除非首先向源服务器重新验证该条目

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

特别是关于no-cache,这是用户代理实际上从经验上对待这个指令的方式吗?

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

请参阅此评论:

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

无缓存

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

有人对此有更正式的说法吗?

更新

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

这是我直到现在才放在心上的东西。RFC说不要轻率地使用必须重新验证。问题是,对于web服务,您必须持负面看法,并为未知的客户端应用程序做最坏的打算。任何过时的资源都有可能导致问题。

还有一些我刚刚考虑过的问题,如果没有Last-Modified或ETags,浏览器只能再次获取整个资源。然而,在使用ETags时,我观察到Chrome似乎至少在每次请求时都会重新验证。这使得这两个指令都没有实际意义,或者至少命名不佳,因为它们不能正确地重新验证,除非请求还包括其他导致“总是重新验证”的头部。

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

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

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

--所以我将最终标记Gili的答案!

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-11-13 03:53:16

我相信must-revalidate的意思是:

缓存过期后,拒绝向用户返回过时的响应,即使用户表示可以接受过时的响应。

no-cache意味着:

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

如果响应可缓存10秒,则must-revalidate在10秒后生效,而no-cache表示0秒后为must-revalidate

至少,这是我的解释。

票数 216
EN

Stack Overflow用户

发布于 2016-06-10 14:13:45

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

票数 27
EN

Stack Overflow用户

发布于 2016-11-17 15:25:26

根据Jeffrey Fox对no-cache的解释,我在chrome 52.0.2743.116m下进行了测试,结果表明no-cachemust-revalidate具有相同的行为,当服务器不可达时,它们都不会使用本地缓存,当服务器不可达时,它们都会使用缓存,而当服务器不可达时,它们都会点击浏览器的后退/前进按钮。如上所述,我认为max-age=0, must-revalidateno-cache是相同的,至少在实现上是一样的。

票数 18
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18148884

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档