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/.
建议
-
仅使用 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进一步降低它们的实用性。
不要使用Expires
header。在现代浏览器中Expires
被取代Cache-Control
. Expires: 0
and Pragma: no-cache
are 技术上无效的响应标头。是的,它们从一开始就存在,但并非所有现代浏览器(例如 Chrome)都使用它们,并且它们已被Cache-Control
.
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 的印象......
通过设置允许浏览器发出条件请求ETags
.
Etag 允许浏览器进行轻量级检查以查看内容是否已更改 https://developers.google.com/web/fundamentals/performance/optimizing-content-efficiency/http-caching#validating-cached-responses-with-etags如果没有,它可以避免发出完整的请求。
请注意,有些浏览器刚刚损坏,需要破解. 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(使用前将#替换为@)