Http 缓存控制头和条件请求

Http 缓存控制头和条件请求,http,http-headers,browser-cache,cache-control,Http,Http Headers,Browser Cache,Cache Control,具有缓存控制标头且具有未来某个时间点的最大使用期限的响应是否应在下次需要资源时发送条件请求 例如,我已将服务器设置为在10天内返回一个缓存控制头过期,并且确信来自服务器的资源的第一个响应是Http状态:200,带有Cache Control max age=864000头。但是,第二次需要资源时,会发出另一个请求,这一次会返回Http状态:304。上次修改的标题都是过去的某个日期 在所有资源都没有改变并且缓存版本被使用之后,我得到304状态这一事实并不令人惊讶。然而,这显然是一项有条件的请求,是

具有
缓存控制
标头且具有未来某个时间点的最大使用期限的响应是否应在下次需要资源时发送条件请求

例如,我已将服务器设置为在10天内返回一个缓存控制头过期,并且确信来自服务器的资源的第一个响应是
Http状态:200
,带有
Cache Control max age=864000
头。但是,第二次需要资源时,会发出另一个请求,这一次会返回
Http状态:304
。上次修改的
标题都是过去的某个日期

在所有资源都没有改变并且缓存版本被使用之后,我得到304状态这一事实并不令人惊讶。然而,这显然是一项有条件的请求,是否应该首先提出?我的印象是,如果没有超过缓存控制头的最大期限,那么浏览器甚至不应该发出请求,而应该只使用资源的缓存版本

我最初认为这是IE9浏览器的问题,因为这是我正在测试它的浏览器,在谷歌搜索了一下之后,我发现了下面的文章。这篇文章证实了我的想法,即不应请求未过时的缓存资源:

如果浏览器以后需要本地缓存中的资源, 将检查该资源的标头,以确定缓存的副本是否正确 还新鲜。如果缓存的副本是新的,则不会发送任何网络请求 并且客户端只需重用缓存中的资源

如果缓存的响应过时(早于其最大期限或过期 然后客户端将向服务器发出有条件的请求 确定以前缓存的响应是否仍然有效,以及 应该重复使用。条件请求包含一个 如果自修改和/或如果没有匹配的标题,则指示 服务器浏览器缓存已包含的内容的版本。 服务器可以通过以下方式指示客户端的版本仍然是新的 返回没有正文的HTTP/304 Not Modified标头,或者它可以 通过返回HTTP/200来指示客户端的版本已过时 OK使用新版本的内容进行响应

我还检查了IE的Internet选项,并再次检查了
检查存储页面的较新版本
选项设置为
自动
,这应该让浏览器决定何时请求资源

为了更好的衡量,我还在Firefox和Chrome中测试了这一点,发现这不是IE9的问题,因为这两种浏览器的响应方式与IE9相同,并发送了条件响应


如果为未过期的缓存项发送条件请求,这是正常行为吗?

您是对的。在正常情况下,如果缓存仍然有效,则不应发出条件请求。这意味着还有其他一些事情在让浏览器运行并检查缓存。请继续阅读:

IE发出有条件请求的原因有很多 对于已在缓存中的项目:

  • 根据缓存控制,缓存项不再新鲜或过期
  • 缓存的项是通过一个VARY头传递的
  • 已通过元刷新导航到包含页面
  • 页面中的JavaScript在location对象上调用reload,为bReloadSource传递TRUE
  • 浏览器启动时请求跨主机HTTPS资源
  • 用户刷新了页面

所以你需要做一些挖掘来找出到底发生了什么。您可以在以下链接中获得更多信息:

谢谢您的帮助,但是我已经浏览了列表,没有一个适用。根据问题描述的缓存控制是有效的。没有Expires标头和Varie标头。包含页面不包含元刷新。按F5刷新页面,因此不涉及脚本。这个页面是https,但它都是针对同一个域的。我刚刚阅读了您发布的链接,并意识到您的摘要中的最后一个要点实际上应该是两个。而不是一个。从链接中的详细信息来看,如果使用正常刷新(不按住ctrl键的F5)手动刷新页面,则浏览器将始终执行有条件的http请求。以及使用强制刷新(Ctrl+F5)的完全无条件请求。因此,如果浏览器刷新(如在测试中),我的问题的答案是肯定的,如果只是请求页面,答案是否定的。IE11(至少)在调试器打开时似乎会影响此处的行为,即使浏览器缓存中存在资源的新副本,也会强制对资源执行条件GET。关闭调试器将恢复到预期的行为,即从缓存加载。