浏览器使用什么启发式来缓存未明确设置为可缓存的资源?

Ric*_*omi 24 safari firefox internet-explorer google-chrome browser-cache

13.2.2启发式过期

由于源服务器并不总是提供明确的到期时间,因此HTTP缓存通常会分配启发式到期时间,采用使用其他标头值(例如Last-Modified时间)的算法来估计合理的到期时间.HTTP/1.1规范没有提供特定的算法,但确实对其结果施加了最坏情况的约束.由于启发式到期时间可能会影响语义透明度,因此应谨慎使用,我们鼓励源服务器尽可能提供明确的到期时间. HTTP/1.1 RFC 2616

浏览器使用什么算法来估算合理的到期时间?

理想的答案将涵盖所有主要浏览器,并提供源代码或官方博客文章的证据.

Ano*_*non 14

让我们假设我们感兴趣的所有浏览器都是Internet Explorer 8或更新版本(例如IE5在缓存标头方面有一些可怕的行为).

只有一种基于标准的控制缓存方式(使用HTTP/1.1引入) - Cache-ControlHTTP标头.

由于至少1996年IE一直在使用退出策略来缓存HTTPS内容.

自从它推出以来,Chrome已经完成了对HTTPS的选择退出(即除非被告知,否则它将对其进行缓存).2011年,Firefox 4(但不是Safari)切换到HTTPS内容的选择退出缓存.来源.

建议

  1. 仅使用HTTP标头来控制浏览器缓存.如果您决定反对这一点,请注意IE只识别在HTML中设置的两个缓存控制指令:

    <META HTTP-EQUIV="Pragma" CONTENT="no-cache">
    <META HTTP-EQUIV="Expires" CONTENT="-1">
    
    Run Code Online (Sandbox Code Playgroud)

    并且看起来只有前者在HTTPS场景中有用.此外,尝试Pragma在IE中使用时可能会出现问题.最后,Chrome会忽略元标记中的缓存指令,从而进一步降低其有用性.

  2. 不要使用Expires标题.在现代浏览器中Expires被取代Cache-Control.Expires: 0并且Pragma: no-cache技术上是无效的响应标头.是的,它们从一开始就存在,但并非所有现代浏览器(例如Chrome)都使用它们并且它们已被取代Cache-Control.

  3. 所述Vary报头是一个雷区.在较旧的IE中如何Vary表现.XHR的表现如何Vary.找出详细信息是留给读者的一个练习 - 留下的印象是,最好为不同的内容使用不同的URL ...

  4. 允许浏览器通过设置发出条件请求ETags. Etags允许浏览器进行轻量级检查以查看内容是否已更改,如果没有,则可以避免发出完整请求.

  5. 请注意,有些浏览器只是破碎而且需要黑客攻击.IE 8可能在下载已被告知不要缓存的文件时出现问题.

浏览器缓存算法

也可以看看


Ric*_*omi 10

来自Chromium的源代码:https://code.google.com/p/chromium/codesearch#chromium/src/net/http/http_response_headers.cc&l=1082&rcl=1421094684

  if ((response_code_ == 200 || response_code_ == 203 ||
       response_code_ == 206) && !must_revalidate) {
    // TODO(darin): Implement a smarter heuristic.
    Time last_modified_value;
    if (GetLastModifiedValue(&last_modified_value)) {
      // The last-modified value can be a date in the future!
      if (last_modified_value <= date_value) {
        lifetimes.freshness = (date_value - last_modified_value) / 10;
        return lifetimes;
      }
    }
  }
Run Code Online (Sandbox Code Playgroud)

  • 我想知道Darin是否认为他们的TODO评论会以SO答案结束:p. (3认同)

小智 8

这篇博文说Internet Explorer 9使用max-age = (DownloadTime - LastModified) * 0.1:http://blogs.msdn.com/b/ie/archive/2010/07/14/caching-improvements-in-internet-explorer-9.aspx

这与Mozilla实际上是一样的(这个帖子相当陈旧,我不知道自那以后是否已经改变):https://developer.mozilla.org/en-US/docs/HTTP_Caching_FAQ


jua*_*rro 6

看起来像webkit("...... Safari使用的引擎的OS X系统框架版本......")使用与Chromium相同的启发式方法.

以下内容取自CacheValidation.cpp:

return (creationTime - lastModifiedValue) * 0.1;
Run Code Online (Sandbox Code Playgroud)


Bor*_*sky 4

我上次检查时, Gecko 预计到期时间为now + (now - lastModified)/10