28

13.2.2 启发式过期

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

浏览器使用哪些算法来估计合理的过期时间?

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

4

5 回答 5

22

假设我们感兴趣的所有浏览器都是 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">
    

    似乎只有前者在 HTTPS 场景中有用。此外,尝试Pragma在 IE中使用时可能会出现问题。最后,Chrome 忽略了元标记中的缓存指令,进一步降低了它们的实用性。

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

  3. 标题Vary是一个雷区旧 IE 中的行为方式VaryXHR 的表现如何Vary。找出细节留给读者作为练习 - 并留下印象最好使用不同的 URL 来处理不同的内容......

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

  5. 请注意,有些浏览器刚刚坏了,需要破解IE 8 在下载已被告知不要缓存的文件时可能会遇到问题

浏览器缓存算法

也可以看看

于 2015-08-06T09:36:07.730 回答
11

来自 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;
      }
    }
  }
于 2015-01-14T08:54:42.470 回答
8

似乎webkit“……Safari 使用的引擎的 OS X 系统框架版本……”)使用与 Chromium 相同的启发式方法。

以下内容来自CacheValidation.cpp

return (creationTime - lastModifiedValue) * 0.1;
于 2015-01-15T21:01:23.253 回答
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

于 2014-01-15T11:13:08.440 回答
4

Gecko 估计到期时间为now + (now - lastModified)/10,最后我检查了一下。

于 2013-01-16T02:52:51.037 回答