浏览器的缓存策略是什么?
浏览器的缓存策略主要分为强缓存和协商缓存。
一、强缓存
强缓存是在缓存期间,浏览器不会向服务器发送请求,直接从本地缓存中获取资源。
实现强缓存主要通过设置 HTTP 响应头中的 Cache-Control 和 Expires 字段。
Cache-Control:可以设置多种指令,比如max-age表示资源的缓存时间(以秒为单位);no-cache表示不使用强缓存,但可以使用协商缓存;no-store表示不进行任何缓存。Expires:指定资源的过期时间,是一个绝对时间。但由于客户端和服务器的时间可能不同步,所以现在更常用Cache-Control的max-age指令。
二、协商缓存
当强缓存失效时,浏览器会向服务器发送请求,服务器根据请求头中的信息判断资源是否有更新。如果资源没有更新,服务器返回 304 Not Modified 状态码,浏览器从本地缓存中获取资源;如果资源有更新,服务器返回新的资源和 200 OK 状态码。
协商缓存通过设置 HTTP 响应头中的 Last-Modified 和 If-Modified-Since 字段,或者 ETag 和 If-None-Match 字段来实现。
Last-Modified和If-Modified-Since:Last-Modified表示资源的最后修改时间,服务器在响应资源时设置这个字段。浏览器在下次请求时,在请求头中带上If-Modified-Since,其值为上次响应头中的Last-Modified的值。服务 器比较这两个时间,如果资源没有更新,返回 304 状态码。ETag和If-None-Match:ETag是资源的唯一标识,服务器在响应资源时设置这个字段。浏览器在下次请求时,在请求头中带上If-None-Match,其值为上次响应头中的ETag的值。服务器比较这两个值,如果资源没有更新,返回 304 状态码。ETag比Last-Modified更加准确,因为它可以基于资源的内容生成,而不仅仅是修改时间。
浏览器在获取资源时,首先检查强缓存,如果强缓存有效,直接使用本地缓存;如果强缓存失效,再检查协商缓存。如果协商缓存也失效,浏览器才会向服务器发送请求获取新的资源。