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

2024-04-13

13.2.2 启发式到期

由于源服务器并不总是提供明确的过期时间,因此 HTTP 缓存通常会分配启发式过期时间,并采用使用其他标头值(例如上次修改时间)的算法来估计合理的过期时间。 HTTP/1.1 规范没有提供具体的算法,但确实对其结果施加了最坏情况的限制。由于启发式过期时间可能会损害语义透明度,因此应谨慎使用它们,并且我们鼓励源服务器尽可能提供明确的过期时间。HTTP/1.1 RFC 2616 http://www.w3.org/Protocols/rfc2616/rfc2616-sec13.html

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

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


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

只有一种基于标准的控制缓存的方法(随 HTTP/1.1 引入) -Cache-ControlHTTP 标头 https://developers.google.com/web/fundamentals/performance/optimizing-content-efficiency/http-caching#cache-control.

至少从 1996 年起,IE 就一直使用选择退出策略来缓存 HTTPS 内容。

似乎自推出以来,Chrome 就选择退出 HTTPS(即,除非被告知不要这样做,否则它将缓存它)。 2011 年,Firefox 4(但不是 Safari)切换到选择退出 HTTPS 内容缓存。Source http://securityevaluators.com/knowledge/case_studies/caching/.

建议

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

    <META HTTP-EQUIV="Pragma" CONTENT="no-cache">
    <META HTTP-EQUIV="Expires" CONTENT="-1">
    

    而在 HTTPS 场景下,似乎只有前者有用。进一步地,可以有尝试使用时出现问题Pragma in IE https://support.microsoft.com/kb/222064。最后,Chrome 忽略元标记中的缓存指令 https://bugs.chromium.org/p/chromium/issues/detail?id=2763进一步降低它们的实用性。

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

  3. The Vary http://www.bizcoder.com/the-insanity-of-the-vary-header标题是一个雷区. How Vary在较旧的 IE 中表现 http://blogs.msdn.com/b/ieinternals/archive/2009/06/17/vary-header-prevents-caching-in-ie.aspx. How Vary与 XHR 一起运行 http://jakearchibald.com/2014/browser-cache-vary-broken/。找出详细信息留给读者作为练习 - 并留下最好对不同内容使用不同 URL 的印象......

  4. 通过设置允许浏览器发出条件请求ETags. Etag 允许浏览器进行轻量级检查以查看内容是否已更改 https://developers.google.com/web/fundamentals/performance/optimizing-content-efficiency/http-caching#validating-cached-responses-with-etags如果没有,它可以避免发出完整的请求。

  5. 请注意,有些浏览器刚刚损坏,需要破解. IE 8 在下载被告知不要缓存的文件时可能会出现问题 http://blogs.msdn.com/b/ieinternals/archive/2009/10/02/internet-explorer-cannot-download-over-https-when-no-cache.aspx.

浏览器缓存算法

  • 铬49.0.2606.2HttpResponseHeaders::GetFreshnessLifetimes() https://chromium.googlesource.com/chromium/src/+/49.0.2606.2/net/http/http_response_headers.cc#1001
  • Firefox HTTP 缓存常见问题解答 https://developer.mozilla.org/en-US/docs/Web/HTTP/Caching_FAQ, 火狐 38 ESRnsHttpResponseHead::ComputeFreshnessLifetime() https://github.com/mozilla/gecko-dev/blob/esr38/netwerk/protocol/http/nsHttpResponseHead.cpp#L422 .
  • Internet Explorer(6+?) https://support.microsoft.com/kb/234067, IE 8+ 中的 HTTPS 缓存 http://blogs.msdn.com/b/ieinternals/archive/2010/04/21/internet-explorer-may-bypass-cache-for-cross-domain-https-content.aspx, 互联网浏览器 9+ http://blogs.msdn.com/b/ie/archive/2010/07/14/caching-improvements-in-internet-explorer-9.aspx, 互联网浏览器 9+ http://blogs.msdn.com/b/ieinternals/archive/2010/07/08/technical-information-about-conditional-http-requests-and-the-refresh-button.aspx.
  • Webkit(Safari)computeFreshnessLifetimeForHTTPFamily() https://github.com/WebKit/webkit/blob/84fa376ac91afc3088e31206c5ab377e1b470b72/Source/WebCore/platform/network/CacheValidation.cpp#L107

See also

  • Google 的浏览器缓存建议 https://developers.google.com/speed/docs/insights/LeverageBrowserCaching.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 排除单个浏览器使用 CSS 类

    我想排除 Internet Explorer 使用特定的 CSS 类 这可能吗 Details 我有一个 css 类 看起来像 input type radio checked input type radio hover box shad
  • 如何在 Chrome 中创建 TouchEvent?

    The W3C规范 http www w3 org TR 2011 WD touch events 20110505 idl def TouchEvent宣称initTouchEvent如下 void initTouchEvent in D
  • css 计数器在 Internet Explorer 中无法工作以获取隐藏内容 - 如何修复?

    我们想要一些编号列表 并发现了这个很酷的计数器 您可以在 css 中使用它来让浏览器为您计算数字 ol instructions counter reset instructions section ol instructions gt l
  • 是否可以仅针对 Chrome,而不是所有支持 Webkit 的浏览器?

    隐约相关这个问题 https stackoverflow com questions 2447511 can you target google chrome 但又不完全相同 我只想定位 Chrome 而不定位 Safari 我使用了以下媒
  • System.InvalidCastException:指定的强制转换无效

    使用 WatiN 的自动化正在进行中 使用几个并发线程来测试应用程序 很少有线程失败 日志报告 堆栈跟踪显示以下内容 System InvalidCastException Specified cast is not valid at SH
  • 从 firefox 扩展获取 firefox 选项卡的 url

    在 Firefox 扩展中 如何枚举当前窗口的选项卡并检索它们的 URL 有一个代码片段位于MDC https developer mozilla org en US docs Archive Add ons Tabbed browser
  • Chrome 87 在针对 Windows IIS 10 的 CORS 中的 Windows 身份验证失败

    Chrome 86 及更早版本 Edge Curl 和 IE 都能够对 Windows 2019 计算机上的 IIS 10 ASP NET 服务进行跨域 Windows 身份验证 没有任何问题 但 Chrome 87 失败 并显示 从源 h
  • CSS @font-face 有时在 Internet Explorer 中有效,但并非总是有效

    我在使用 Internet Explorer 11 中的网络字体时遇到问题 该字体适用于某些使用 IE11 的用户 但不适用于其他用户 即使它们是同一浏览器 对于遇到问题的用户 Modernizr fontface 仍然返回 true 因此
  • Facebook JS SDK渐进式网络应用程序问题

    我有一个使用 Angular 4 构建的渐进式 Web 应用程序 我的问题是从主屏幕应用程序使用时 Facebook 登录对话框不会自动关闭 在 Chrome 浏览器中打开时它工作得很好 但是当我从安装的主屏幕应用程序使用它时 对话框窗口打
  • Chrome 模拟设备的 OnePlus 3 和 OnePlus 5 视口尺寸

    我想将 OnePlus 3 和 OnePlus 5 作为自定义设备添加到 Google Chrome 的模拟设备列表中 请提供视口大小 以便我可以用它来测试我的网站 像素 2 显示尺寸示例 提前致谢 我正在寻找同样的东西 我发现了这个 ht
  • (Django) AJAX 请求的 CSRF 验证在 Chrome 中工作,但在 Firefox 中不起作用

    正如标题所述 我的 Django CSRF 验证在 Chrome 中有效 但在 Firefox 中无效 我想知道原因 以便解决此问题 我已将此包含在head我的标签基本 html我的应用程序中的所有其他文件都从中扩展的文件 base htm
  • 返回导航缓存 - IE

    当我在 IE 11 上运行 Web 应用程序时 收到如下警告消息 DOM7011 此页面上的代码禁用了后退和前进缓存 为了 更多信息 请参阅 http go microsoft com fwlink LinkID 291337 http g
  • Chromium 上的 HEAD XMLHttpRequest

    我尝试使用 Chromium 中的 XMLHttpRequest 获取 HEAD 响应以检索压缩 url 的位置 URL 但失败 var ajax new XMLHttpRequest ajax onreadystatechange fun
  • cookie神秘重现的原因是什么?

    我正在开发一个使用 cookie 来存储会话信息的 Web 应用程序 我已经手动删除了会话 cookie 因为我正在处理代码的另一部分 我不需要登录会话 然而 在页面重新加载几次后 会话 cookie 神秘地重新出现 其中包括我之前出于测试
  • Safari 中透明颜色会发生什么情况?

    有一个块 其中接近末尾的文本逐渐消失 这是使用以下方法完成的 after 给定linear gradient从透明色到背景色 最近注意到 在当前版本的浏览器中 除了 safari 之外 一切都很好 在第 11 版中 情况太糟糕了 Autop
  • Selenium 打开未登录 Chrome 帐户的 chrome

    我最近一直在使用 Selenium WebDriver 我还专门使用 chromedriver 每当我打开一个新的 chrome 窗口 driver get url 时 Chrome 都会以完全默认的状态启动 而不是我刚刚从我的扩展坞打开一
  • 背景大小:封面在 Google Chrome 中突然停止工作?

    还有其他人有这个问题吗 我以创建网站为生 有些网站使用了 css 属性background size cover 大约 1 周前突然间 所有具有此属性的网站都不再在 Google Chrome 中正确显示 所有其他浏览器都工作正常 还有其他
  • border-radius 在 safari 下失败(丑陋的剪辑)

    有人知道 Safari 中以下 错误 的解决方法吗 当我使用border radius在 CSS3 中创建圆角边框 它在 Safari FF 等上工作得很好 但是 当边框颜色是背景颜色时 您可以看到容器背景与边框重叠 你可以在这里尝试一下
  • 启动 Firefox 并等待其关闭

    Question 我想启动 Firefox 网络浏览器作为访问特定网站的过程 然后等到它关闭 一种特殊情况是浏览器可能已经打开并正在运行 因为用户可能已经访问过某个网站 在这种情况下 浏览器可能会在现有窗口中打开一个新选项卡 并且新启动的进
  • 加密 Chrome 扩展程序?

    无论如何 要加密 Chrome 扩展程序 以免暴露源代码 您可以使用混淆器隐藏您的代码 市场上有很多可用的 像Google Closure编译器这样的工具很少 而且市场上有很多在线javascript ofuscators 你可以使用任何一

随机推荐

  • Yii2:如何使用 301 重定向旧 URL?

    由于 SEO 目的 我想将旧版本网站中的一些 URL 重定向到 Yii2 中的新版本 例如 about us php to about 我怎么做 我不能使用 htaccess 而且我不能使用urlManager规则 因为需要设置HTTP响应
  • 如何发送带有变量的 GraphQL AJAX 查询?

    我正在尝试使用 GraphQL 对 GitHub 进行 API 调用 我已经能够使用静态 graphQL 调用成功地调用数据 但是我在调 用中添加变量 var 条目 时遇到问题 以便我可以基于更改调用用户在网络应用程序中提供的输入 我使用
  • 索引操作到底发生了什么?

    今天我正在为一个包含 20 亿条记录的巨大表建立索引 我以为 MySQL 会吃掉我的 2TB 驱动器 磁盘消耗不断增加到 400GB 然后是 500GB 最后下降到 180GB MySQL 说成功添加了索引 为什么空间会增加 最后发生了什么
  • 当我从 NSManagedObjectContext 获取数据时出现错误

    我运行我的应用程序 然后获取我的数据 数据没问题 当我第二次跑步时 我对自己的旧价值观产生了错误 怎么了 BOOL application UIApplication application didFinishLaunchingWithOp
  • 将 Java 代码移植到 ObjC 时,如何最好地表示已检查的异常?

    我正在致力于将 Java 代码库移植到 Cocoa Objective C 以在桌面 Mac OS X 上使用 Java 代码有lots and lots带有检查异常的方法 例如 double asNumber throws FooExce
  • 使用 RVM 在 Ubuntu 上安装 Rails Path

    我是一个运行 Ubuntu 10 04 并尝试安装 Rails 的 Linux 菜鸟 我首先安装了ruby 然后安装了RVM 然后下载并安装了rubygems 然后安装了rails Rails 似乎只有在命令前面有 sudo 时才会响应 如
  • 如何将列表视图中行的值传递给按钮

    我创建了一个自定义listview using SimpleAdapter and in 列表视图的每一行我都放了一个按钮有单一 ID 我想要得到position每行传递按钮 但我每行都有一个按钮 id 我想要当我点击按钮它找到行的位置并开
  • 找到最大的素数因子?

    我需要找到 13195 的质因数是 5 7 13 和 29 最大的是377 数字 600851475143 的最大质因数是多少 include
  • HTTP 错误 500.31 - ANCM 无法在 IIS 中找到本机依赖项

    我尝试运行一个Blazor应用 Web Server runs NET Core 3 0 Web Client runs NET Standard 2 0 Web Shared runs NET Standard 2 0 发布并上传应用程序
  • 在与表单相同的模态窗口中加载 php 成功消息

    您好 我正在尝试让我的 php 表单成功 或错误 消息加载到表单实际所在的模态窗口中 我想只在模态中打开表单 而不必以任何原因切换页面 我一直在搜索 S O 但找不到类似的东西 也许我没有问正确的问题 我不知道 我的代码目前如下所示 编辑
  • 抽象 CRUD 控制器是个好主意吗?

    我们正在使用 ASP NET MVC 开发一个相当大的应用程序 一开始我们发现拥有一个具有常见 CRUD 操作 新建 保存 删除 以及默认列表操作的抽象基本控制器可能很有用 在我们的例子中 我们有 20 多个实体通过这种控制器进行管理 这有
  • HTML 代码检查 PhpStorm 中分成多个文件的块

    有没有办法告诉 PhpStorm 仅评估 header php 和 footer php 就像浏览器在运行 index php 时所做的那样 考虑一个包含 4 个文件的项目 index php 服务器端内容 业务逻辑 header php
  • Android:如何检测用户何时停止对着麦克风说话

    我有一个 Android 应用程序 在应用程序启动时开始从麦克风录音 在我当前的版本中 用户必须按 停止 按钮才能停止录制 如何检测用户已停止说话并使用它来触发录音机停止 类似于 Android 中语音识别功能的实现 用户停止说话 然后语音
  • 使用类似“标签”的单元格设置集合视图

    我一直在与客户合作UICollectionViewFlowLayout调整细胞之间的空间 这样我就可以在我的细胞中获得良好的流动collectionView 但使用我当前的代码 我无法弄清楚如何在不 破坏 行数的情况下调整单元格大小 这使得
  • Haskell 中模拟对象的身份

    用面向对象的语言编写模拟时 每个对象都有一个标识 即一种将其与模拟中的其他对象区分开来的方法 即使其他对象具有完全相同的属性 一个对象无论随着时间的推移发生了多大的变化 都会保留其身份 这是因为每个对象在内存中都有唯一的位置 我们可以用指针
  • 在 nginx 重写中发送额外的标头

    现在 我正在将我的应用程序的域从app example com to app newexample com使用以下内容nginx config server server name app example com location app
  • Excel 单元格值作为字符串不会存储为字符串

    我无法在此处获取此代码来获取单元格内容并将其存储为字符串 我得到一个双倍 54 6666666667代替N03 DM 示例单元格内容 如果我使用Cstr Sheet1 Cells i 5 Value 我仍然得到相同的结果 任何帮助 将不胜感
  • Jquery-nice-select 插件无法正常工作

    我正在使用 Jquery nice select 插件 http hernansartorio com jquery nice select http hernansartorio com jquery nice select 我有两个选择
  • 具有非常大的数字的十六进制到 int C#

    我有一个 256 个字符长的字符串 其中包含一个十六进制值 EC851A69B8ACD843164E10CFF70CF9E86DC2FEE3CF6F374B43C854E3342A2F1AC3E30C741CC41E679DF6D07CE6
  • 浏览器使用什么启发式方法来缓存未明确设置为可缓存的资源?

    13 2 2 启发式到期 由于源服务器并不总是提供明确的过期时间 因此 HTTP 缓存通常会分配启发式过期时间 并采用使用其他标头值 例如上次修改时间 的算法来估计合理的过期时间 HTTP 1 1 规范没有提供具体的算法 但确实对其结果施加