关于浏览器默认缓存策略(启发式缓存)

151 阅读1分钟

我起了一个简单的http服务,主要作用就是代理静态资源,在更新静态资源后,发现浏览器访问的还是旧的资源,翻来覆去检查响应头,并没有配置任何缓存策略,而且静态资源请求也都变成disk cachememory cache,很明显是被强缓存了

这里,很多同学大概率是掉入了启发式缓存的坑。

启发式缓存(Heuristic caching),在没有明确缓存配置时(可以简单的理解为没有设置 Cache-Control 或 Expires 响应头),响应头有设置Last-Modified信息,就会触发一个默认缓存策略。

如下响应头示例:

HTTP/1.1 200 OK

Content-Type: text/html

Content-Length: 1024

Date: Tue, 22 Feb 2022 22:22:22 GMT

Last-Modified: Tue, 22 Feb 2021 22:22:22 GMT

<!doctype html>

这里的Date创建时间大于Last-Modified一年,那么浏览器会默认进行读取本地缓存时间为1year * 0.1约为36.5天,即在接下来的36.5天里,不会发送HTTP请求,直接拉取本地缓存,表现为disk cache或者memory cache。参考源码片段:

return (creationTime - lastModified) * 0.1;

如要避免浏览器的默认缓存策略(启发式缓存),建议配置Cache-Control 或 Expires响应头的过期时间为0