浏览器的缓存策略主要包括两种主要机制:强缓存和协商缓存。
1. 强缓存(也称为绝对缓存)
-
Expires: 这是HTTP/1.0中的字段,服务器设定一个具体的到期时间,只要在这个时间之前,浏览器都会直接从缓存中读取资源,而不发出任何请求到服务器。
-
Cache-Control: HTTP/1.1引入的新机制,比Expires更为灵活,支持max-age指令,表明资源在多长时间内有效,以及no-cache、no-store等指令来控制缓存行为。
当浏览器发起请求时,首先会检查是否存在有效的强缓存,如果有,则直接从本地缓存中获取资源,不会产生网络请求,状态码为200(from cache)。
2. 协商缓存(也称为条件请求)
-
Last-Modified/If-Modified-Since: 服务器在响应头中添加Last-Modified字段表示资源最后修改时间,浏览器在下次请求时带上If-Modified-Since字段,若服务器资源未改变,则返回304 Not Modified,告知浏览器使用本地缓存。
-
ETag/If-None-Match: ETag是服务器为每个资源生成的唯一标识符,浏览器在后续请求时带上If-None-Match,与服务器对比资源的当前ETag,若未改变,服务器也会返回304 Not Modified。
协商缓存发生在强缓存失效后,浏览器依然会向服务器发送请求,但请求头中包含了可以用来判断资源是否更新的信息,服务器根据这些信息决定是否重新发送资源内容。
总结
浏览器缓存策略的目的是减少不必要的网络请求,提高页面加载速度和用户体验。整个缓存过程按照以下顺序进行:
- 检查本地缓存是否有符合要求的强缓存,若有则直接使用。
- 若强缓存失效,则发起请求至服务器,询问资源是否发生变更(协商缓存)。
- 如果协商缓存命中,服务器指示浏览器继续使用本地缓存;否则,服务器发送最新资源给浏览器并更新缓存。
此外,还有Service Worker、内存缓存(memory cache)和HTTP缓存头(如Pragma、Vary等)等其他缓存手段,共同构成了浏览器全面且高效的缓存策略体系。