使IE缓存资源但始终重新验证

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使IE缓存资源但始终重新验证相关的知识,希望对你有一定的参考价值。

缓存控制标头“no-cache,must-revalidate,private”允许浏览器缓存资源,但强制使用条件请求重新验证。这在FF,Safari和Chrome中可以正常使用。

但是,IE7 + 8不发送条件请求,即请求头中缺少“If-Modified-Since”,因此服务器使用HTTP / 200而不是HTTP / 304进行响应。

以下是完整的服务器响应标头:

Last-Modified: Wed, 16 Feb 2011 13:52:26 GMT
Content-type: text/html;charset=utf-8
Content-Length: 10835
Date: Wed, 16 Feb 2011 13:52:26 GMT
Connection: keep-alive
Cache-Control: no-cache, must-revalidate, private

这似乎是一个IE错误,但我没有在网上找到任何相关内容,所以我想知道是否可能缺少或存在另一个标头会让IE表现得很奇怪?

讨论no-cache和max-age之间的区别:What's the difference between Cache-Control: max-age=0 and no-cache?

答案

我终于搞清楚了。这是一个解释和经过测试的解决方案。

以下网站证实了我的观察:http://blog.httpwatch.com/2008/10/15/two-important-differences-between-firefox-and-ie-caching/

它表示IE不会在本地存储带有'no-cache'指令的页面,因此总是发送无条件请求。

还有一篇MS支持文章 - https://support.microsoft.com/help/234067/ - 证实了这一点:

“Internet Explorer支持HTTP 1.1 Cache-Control标头,当指定no-cache值时,它会阻止特定Web资源的所有缓存...”

这种行为并非完全错误 - 但它不是RFC 2616(第14.9.1节)的意图。关于'no-cache',它说“......一个缓存绝不能使用响应来满足后续请求,而不能与原始服务器成功重新验证。”因此可以缓存响应,但必须重新验证它。除了IE之外,主要的浏览器会缓存响应并重新验证它。为了防止存储请求,存在“无存储”Cache-Control指令。

总之,IE将'no-cache'视为'no-store'。

以下是以一致的方式为IE和其他浏览器启用条件请求的解决方案:

不要使用no-cache,而是将Expires头设置为过去(或-1,具有相同的效果)。然后,IE以及其他主要浏览器将发送条件请求。 (注意,您还应该知道IE Vary头错误,这会阻止缓存。)

这些是关键的标题字段:

Last-Modified: Wed, 16 Feb 2011 13:52:26 GMT
Expires: -1
Cache-Control: must-revalidate, private
  • 需要Last-Modified(或ETag)作为验证器
  • Expires -1表示资源已过时,必须重新验证
  • Cache-Control不得包含no-cache或no-store
另一答案
   $last_modified = filemtime($_SERVER['SCRIPT_FILENAME']);

   session_cache_limiter(FALSE);

   header("Content-Type: text/css");
   header("Cache-Control: max-age=1, must-revalidate, private");
   header("Last-Modified: " . gmdate("D, d M Y H:i:s", $last_modified) . " GMT");

   if(isset($_SERVER["HTTP_IF_MODIFIED_SINCE"]))
   {
      if(strtotime($_SERVER["HTTP_IF_MODIFIED_SINCE"]) >= $last_modified)
      {
         header("HTTP/1.1 304 Not Modified");
         exit;
      }
   }

以上是关于使IE缓存资源但始终重新验证的主要内容,如果未能解决你的问题,请参考以下文章

可折叠工具栏 - 使片段页脚在 Android 中始终可见

apache是 否可以重新启动可靠地清除pagespeed缓存?

HTTP 缓存 - 与服务器检查,始终发送 If-Modified-Since

高效Web开发的10个jQuery代码片段

如何使控制台中的视图缓存片段过期?

如何检测 XHR 何时返回缓存的资源?