37

缓存控制头“no-cache,must-revalidate,private”允许浏览器缓存资源,但强制使用条件请求进行重新验证。这在FF,Safari和Chrome中按预期工作。使IE缓存资源,但总是重新验证

但是,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浏览器的bug,但我还没有在网上找到相关的东西,所以我不知道是否有另一个头的也许不存在或存在使IE看起来很奇怪?

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

+0

进入Internet选项==>常规选项卡==>浏览历史记录部分==>设置...按钮。看看“检查存储页面的更新版本:”选择器。确认此缓存行为是否与其设置相关联(对于大多数用户而言,它应该是自动的)。 – rskar 2011-02-16 14:43:53

+1

它不**与此行为相关联。 – alienhard 2011-02-16 17:17:01

回答

66

我终于想通了。这是一个解释和测试解决方案。

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

它说,IE浏览器在本地不保存的页面与“无缓存”指令,因此始终将无条件请求。

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

“Internet Explorer支持的HTTP 1.1 Cache-Control头,指定无缓存值时,防止特定的Web资源的所有缓存...“

此行为并非完全错误 - 但它不是RFC 2616(第14.9.1节)的意图。关于'no-cache'它说:“......一个缓存不能使用该响应来满足后续请求,而不需要使用原始服务器成功重新验证。”所以响应可以被缓存,但必须重新验证它。除IE以外的主要浏览器都会缓存响应并对其进行重新验证。为了防止存储请求,有'无存储'缓存控制指令。

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

而这里的解决方案来实现对IE和其他浏览器条件请求以一致的方式:

不要使用无缓存,而是设置Expires头过去(或 - 1,具有相同的效果)。 IE以及其他主要浏览器将发送条件请求。 (注意,你也应该知道IE Vary头部错误,它可以防止缓存。)

这些都是关键的报头字段:

Last-Modified: Wed, 16 Feb 2011 13:52:26 GMT 
Expires: -1 
Cache-Control: must-revalidate, private 
  • 上次修改(或ETag的)需要作为验证
  • 过期-1告诉该资源是过时并且必须重新验证
  • 的Cache-Control不得包括无缓存或无店铺
-2
$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; 
     } 
    }