缓存控制标头和条件请求

时间:2014-05-19 12:01:32

标签: http http-headers browser-cache cache-control

如果具有Cache-Control标头且未来某个点的最大年龄的响应是否应在下次需要资源时发送条件请求?

例如,我已将服务器设置为返回一个Cache-Control标头,以便在10天后过期,并且确定来自服务器的资源的第一个响应为Http Status: 200Cache-Control max-age=864000头。但是,第二次需要资源时会发出另一个请求,这次返回Http Status: 304Last-Modified标题都是过去的某个日期。

我获得304状态的事实并不令人惊讶,因为所有资源都没有改变,然后使用缓存版本。但是,首先应该提出明确是有条件的请求吗?我的印象是,如果没有超过缓存控制头的最大年龄,那么浏览器甚至不应该发出请求,而应该只使用资源的缓存版本。

我首先认为这是一个IE9浏览器问题,因为这是我正在测试它的浏览器,经过一番谷歌搜索后我在caching improvements in IE9找到了以下文章。文章证实了我的想法,不应该对不会过时的缓存资源提出请求:

  

如果浏览器稍后需要本地缓存中的资源,   检查该资源的标头以确定缓存副本是否   仍然新鲜。如果缓存副本是新鲜的,则没有网络请求   制作,客户端只需重新使用缓存中的资源。

     

如果缓存的响应过时(早于其最大年龄或超过过期)   date),然后客户端将向服务器发出条件请求   确定先前缓存的响应是否仍然有效   应该重复使用。条件请求包含一个   If-Modified-Since和/或If-None-Match标头指示   服务器浏览器缓存已包含的内容版本。   服务器可以指示客户端的版本仍然是新鲜的   返回没有正文的HTTP / 304 Not Modified标头,或者它可以   通过返回HTTP / 200指示客户端的版本已过时   使用新版本的内容即可回复。

我还检查了IE的Internet选项并仔细检查了Check for newer versions of stored pages选项设置为Automatically,这应该让浏览器决定何时请求资源。

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

这是否应该为非陈旧的缓存项发送条件请求?

1 个答案:

答案 0 :(得分:2)

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

  

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

     
      
  • 根据Cache-Control或Expires
  • ,缓存的项目不再新鲜   
  • 缓存的项目随VARY标头一起提供
  •   
  • 通过META REFRESH
  • 导航包含的页面   
  • 页面中的JavaScript名为reload on location object,为bReloadSource传递TRUE
  •   
  • 请求是针对浏览器启动时的跨主机HTTPS资源
  •   
  • 用户刷新了页面
  •   

因此,您需要进行一些挖掘,以了解发生了什么。您可以通过以下链接获取更多信息:http://blogs.msdn.com/b/ieinternals/archive/2010/07/08/technical-information-about-conditional-http-requests-and-the-refresh-button.aspx