我起了一个简单的
http服务,主要作用就是代理静态资源,在更新静态资源后,发现浏览器访问的还是旧的资源,翻来覆去检查响应头,并没有配置任何缓存策略,而且静态资源请求也都变成disk cache或memory 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。