当前位置: 首页 > 知识库问答 >
问题:

无缓存和必须重新验证缓存控制之间的区别?

宋昕
2023-03-14

来自RFC 2616

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

无缓存

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

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

将此与

必须重新验证

当缓存接收到的响应中存在must-revalidate指令时,该缓存在该条目过期后不得使用该条目来响应后续请求,而无需首先与源服务器重新验证该条目

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

特别是关于无缓存,用户代理实际上是这样,根据经验处理此指令的方式吗?

如果有< code >必须重新验证和< code >最大年龄,那么< code >无缓存有什么意义呢?

看到这个评论:

http://palpapers . ply nt . com/issues/2008 jul/cache-control-attributes/

无缓存

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

有人对此有更正式的消息吗?

更新

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

那是我直到现在才放在心上的事情。RFC说不要轻易使用必须重新验证。问题是,对于web服务,您必须对未知的客户端应用程序采取消极的看法并做最坏的打算。任何过时的资源都有可能导致问题。

还有我刚刚考虑过的,没有Last-Modified或ETags,浏览器只能再次获取整个资源。然而,对于ETags,我观察到Chrome至少似乎对每个请求都进行了重新验证。这使得这两个指令都没有实际意义,或者至少命名不当,因为它们不能正确地重新验证,除非请求还包括其他标头,否则无论如何都会导致“总是重新验证”。

我只想把最后一点说得更清楚一些。只需设置必须重新验证,但不包括 ETag 或上次修改时间,代理只能再次获取内容,因为它没有要发送到服务器进行比较的内容。

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

因此,< code>must-revalidate的目的是在失效时强制“绕过缓存”,这只有在设置了生存期/年龄时才会发生,因此,如果在没有年龄或其他标头的响应上设置了< code>must-revalidate,它实际上相当于< code>no-cache,因为响应将被立即视为失效。

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

共有3个答案

别浩漫
2023-03-14

根据Jeffrey Fox对无缓存的解释,我已经在chrome 52.0.2743.116 m下进行了测试,结果表明无缓存具有与必须重新验证相同的行为,当服务器无法访问时,它们都不会使用本地缓存,并且,当服务器无法访问时,它们都将使用缓存,同时点击浏览器的“后退/前进”按钮。如上所述,我认为max-age=0,必须重新验证无缓存相同,至少在实现中是这样。

艾宁
2023-03-14

最大年龄=0,必须重新验证no cache必须重新验证时,如果服务器没有响应重新验证请求,浏览器/代理将返回504错误。如果没有缓存,它将只显示缓存的内容,这可能是用户的首选(最好有一些过时的东西,而不是什么都没有)。这就是为什么必须重新验证仅用于关键交易的原因。

苍德寿
2023-03-14

我相信必须重新验证的意思是:

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

而< code>no-cache意味着:

必须重新验证加上响应立即变得陈旧的事实。

如果响应可缓存10秒,则必须重新验证在10秒后启动,而no-cache意味着必须重新验证在0秒后启动。

至少,这是我的解释。

 类似资料:
  • 我在维基百科上读到语用标头,上面写着: “pragma:no-cache header字段是用于请求的HTTP/1.0标头。它是浏览器告诉服务器和任何中间缓存它需要资源的新版本的一种方法,而不是服务器告诉浏览器不要缓存资源。一些用户代理在响应中确实会注意此标头,但HTTP/1.1 RFC特别警告不要依赖此行为。” 但我不明白它是干什么的?值为的标头和值也为的之间有什么区别?

  • 本文向大家介绍Hibernate中一级缓存和二级缓存之间的区别,包括了Hibernate中一级缓存和二级缓存之间的区别的使用技巧和注意事项,需要的朋友参考一下 Hibernate支持两种类型的缓存,一种是第一级缓存,另一种是第二级缓存。  一级缓存是会话级缓存,它始终与会话级对象关联。这种类型的缓存用于通过缓存对象的状态来最小化Db交互。 那不是在事务中完成每次修改之后更新,而是仅在事务结束时更新

  • 使用 rax-plugin-pwa 插件,可以方便快捷的使用 Service Worker 控制缓存,以获得更快的加载速度。 首先,安装 build-plugin-rax-pwa 插件依赖: $ npm install build-plugin-rax-pwa --save 在工程配置 build.json 中添加 pwa 插件并配置缓存目标: { "plugins": [ [

  • 本文向大家介绍虚拟内存和缓存内存之间的区别,包括了虚拟内存和缓存内存之间的区别的使用技巧和注意事项,需要的朋友参考一下 在计算机环境中,内存是至关重要的部分,因为它是唯一负责系统性能和系统存储容量的部分。众所周知,内存负责任何应用程序的加载和执行,还用于存储其数据,以后可被其使用,因此在加载或安装应用程序之前了解系统的内存配置非常重要。 现在,在本主题中基本上将要讨论的是两种类型的存储器,即虚拟存

  • 问题内容: 在编写RESTful Web服务时,如果在客户端(当前是.NET胖客户端)上启用任何类型的缓存,则会遇到问题。默认情况下,Jersey不发送任何类型的缓存控制标头,因此客户端将自动缓存大多数页面(这似乎是有效的行为)。 我希望默认情况下,Jersey发送“ no-cache”的缓存控件,然后特别是响应将覆盖该缓存控件。 有没有办法用泽西岛做到这一点? 我发现RESTeasy可以使用@N

  • 我们已经配置nginx服务器添加缓存控制头到公共和到期时间到1个月。但是当我们从浏览器发出请求时,客户端正在添加缓存控制:无缓存头。正因为如此,它每次都是新鲜下载内容,而不是提供缓存版本。 我怎样才能缓存静态文件? 如果我从终端触发请求,服务器添加的缓存控制标头在响应标头中可见。