首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使IE缓存资源,但始终重新验证

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

Stack Overflow用户
提问于 2011-02-16 22:11:40
回答 2查看 50.3K关注 0票数 43

缓存控制标头"no- cache,must revalidate,private“允许浏览器缓存资源,但强制使用条件请求进行重新验证。这在FF、Safari和Chrome中都能正常工作。

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

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

代码语言:javascript
运行
复制
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的bug,但我还没有在网上找到任何相关的东西,所以我想知道是否另一个头文件的缺失或存在会使IE的行为变得奇怪?

很好地讨论了无缓存和最大年龄之间的区别:What's the difference between Cache-Control: max-age=0 and no-cache?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-02-23 05:48:58

我终于想通了。这里有一个解释和一个经过测试的解决方案。

下面的站点证实了我的观察结果: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 (sec.14.9.1)计划。关于“no- cache”,它说“……缓存在没有成功与源服务器重新验证的情况下,不能使用响应来满足后续请求。”所以响应可以被缓存,但必须重新验证它。除了IE之外,大多数浏览器都会缓存响应并重新验证它。为了防止存储请求,这里有“no-store”Cache-Control指令。

总而言之,IE将“no-cache”视为“no-store”。

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

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

以下是关键的报头字段:

代码语言:javascript
运行
复制
Last-Modified: Wed, 16 Feb 2011 13:52:26 GMT
Expires: -1
Cache-Control: must-revalidate, private

由于validator

  • Expires -1指示资源已过时且必须为revalidated

  • Cache-Control,因此需要
  • Last-Modified (或ETag),不能包含无缓存或无存储的
票数 77
EN

Stack Overflow用户

发布于 2011-08-05 08:05:19

代码语言:javascript
运行
复制
   $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;
      }
   }
票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5017454

复制
相关文章

相似问题

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