浏览器缓存(Cache-Control、max-age和Expires、Etag和Last-Modified)

缓存命中 -> 缓存再验证成功 -> 缓存再验证失败=缓存未命中

零、 Cache-Control

可缓存性
public:http请求返回的过程当中,在cache-control中设置这个值,代表http请求返回的内容所经过的任何路径当中(包括中间一些http代理服务器以及发出请求的客户端浏览器),都可以对返回内容进行缓存操作。
private:代表只有发起请求的浏览器才可以进行缓存。
no-cache:可以在本地进行缓存,但每次发请求时,都要向服务器进行验证,如果服务器允许,才能使用本地缓存。
no-store:本地和代理服务器都不可以存储缓存,每次都要重新请求,拿到内容。
no-transform:主要是用在proxy服务器,不允许进行格式转换。

一、 max-age和Expires

浏览器会先检查缓存是否过期,如果没过期,干脆就不向服务端发起请求,直接使用本地缓存,这叫做“缓存命中”。
max-age:最大缓存时间
Expires:有效期
这两个同时存在时,max-age优先生效

二、Etag和Last-Modified

如果没有上一节的两个标签,或者验证失败,则浏览器向服务器发起请求,浏览器通过Etag或Last-Modified判断浏览器缓存的内容是否过期。如果没过期返回304,这叫做“缓存再验证成功”,浏览器更新本地缓存的max-age和Expires,并且使用本地缓存;如果过期了,这叫做“缓存再验证失败(缓存未命中)”,则返回新的数据。
Etag:被请求变量的实体标记(与客户端请求头 If-None-Match对应)
Last-Modified:被请求变量的最后修改时间(与客户端请求头If-Modified-Since对应)
如果两者都有,就必须同时验证,并且两者都满足才会返回304

参考:

《HTTP头的Expires与Cache-control》
《HTTP缓存控制小结》
《浏览器缓存详解:expires,cache-control,last-modified,etag详细说明》
《缓存头Cache-Control的含义和使用》
《【好】http缓存深入研究,200 from cache or 304 not modified?》
《【好】浏览器是根据什么决定「from disk cache」与「from memory cache」?》

你可能感兴趣的:(前端,前端,缓存,浏览器缓存)