明明没有配置任何缓存策略,浏览器还是给我强缓存了?

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

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

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

如下响应头示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

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。参考源码片段:

1
return (creationTime - lastModified) * 0.1;

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

参考文档: