13.2.2启发式过期
由于原始服务器并不总是提供明确的到期时间,HTTP高速缓存典型地分配启发式期满时间,采用的是使用其它标头值(如上次修改时间)来估计一个合理的过期时间的算法。 的HTTP / 1.1规范没有提供特定的算法,但并不强加其结果最坏情况的约束。 由于启发式过期时间可能会损害语义透明度,他们应该慎重使用,我们鼓励原始服务器,以尽可能多地提供明确的到期时间。 HTTP / 1.1 2616
什么是使用浏览器来估算合理的过期时间的算法?
理想的答案将覆盖所有主要的浏览器从源代码或官方博客文章的证据。
假设我们有兴趣在所有的浏览器为Internet Explorer 8或更高版本(如IE5与缓存头一些可怕的行为)。
仅存在一个基于控制缓存的标准方式(与HTTP / 1.1中引入) -的Cache-Control
HTTP标头 。
自至少1996年IE浏览器一直使用的缓存HTTPS内容的退出政策。
看似自推出以来,Chrome浏览器所做的退出对于HTTPS(即它会缓存,除非告知不要)。 2011年火狐4(但不是Safari浏览器)切换到选择退出的HTTPS内容缓存。 源 。
建议
仅使用HTTP标题来控制浏览器缓存 。 如果您决定违背了这一知道,IE只能识别设置内部HTML二级缓存控制指令:
<META HTTP-EQUIV="Pragma" CONTENT="no-cache"> <META HTTP-EQUIV="Expires" CONTENT="-1">
貌似只有前者是在HTTPS的情况有用。 此外,还可以尝试使用问题时Pragma
中的IE 。 最后, 铬忽略meta标签缓存指令降低其效用甚至进一步。
不要使用Expires
头 。 在现代浏览器Expires
被取代Cache-Control
。 Expires: 0
和Pragma: no-cache
在技术上是无效的响应头。 是的,他们从一开始就存在,但不是所有的现代浏览器(如Google Chrome)使用它们,它们已被取代Cache-Control
。
所述Vary
头部是雷区 。 如何Vary
老年人的IE的行为 。 如何Vary
与XHR的行为 。 寻找细节out保留作为练习读者 - 和给人的印象最好是使用不同的网址不同的内容...
让浏览器设置,使有条件的请求ETags
。 的ETag允许浏览器做一个轻量级的检查,以查看内容发生了变化 ,它可避免使一个完整的要求,如果它没有。
注意某些浏览器只是打破,需要黑客 。 IE 8可以下载其已被告知不缓存文件的问题 。
浏览器的缓存算法
- 铬49.0.2606.2
HttpResponseHeaders::GetFreshnessLifetimes()
- Firefox的HTTP缓存常见问题 , 火狐38 ESR
nsHttpResponseHead::ComputeFreshnessLifetime()
- 的Internet Explorer(6+) , HTTPS缓存在IE 8+ , Internet Explorer的9+ , 互联网浏览器9+ 。
- WebKit的(Safari浏览器)
computeFreshnessLifetimeForHTTPFamily()
也可以看看
从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;
}
}
}
本博客文章说,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
好像WebKit的 (“...这是使用Safari浏览器引擎...的OS X系统架构版本”)使用相同的启发式铬。
以下是摘自CacheValidation.cpp :
return (creationTime - lastModifiedValue) * 0.1;
壁虎在到期估计now + (now - lastModified)/10
,我最后一次检查。
文章来源: What heuristics do browsers use to cache resources not explicitly set to be cachable?