HTTP缓存
先用一张图来解释HTTP缓存的原理
浏览器的缓存分为强缓存和协商缓存。当客户端向浏览器发送请求时,
- 客户端会先根据请求头中的
Cache-Control/Expires
来判断请求的资源是否过期。 - 若没有过期,则命中强缓存,便读取缓存在浏览器中的资源,呈现在浏览器上。
- 若资源过期(大于了
max-age
,或者超过了Expires
的时间)则会向服务器发送请求,服务器根据客户端请求头部的If-Modify-Since
(即响应头部的Last-Modify
)来判断返回给客户端的资源是否更新。 - 若服务器中的资源为更新,则浏览器命中协商缓存,服务器返回状态码304,浏览器从浏览器缓存中获取资源并呈现。
- 若服务器中的资源改变了,服务器返回状态码200,
Last-Modify
以及更新后的资源。客户端接收并呈现。
Cache-Control的常用指令:
- max-age 指定一个时间长度,在这个时间段内缓存是有效的,单位是s
- public 表明响应可以被任何对象(发送请求的客户端、代理服务器等等)缓存
- private 表明响应只能被单个用户(可能是操作系统用户、浏览器用户)缓存,是非共享的,不能被代理服务器缓存
- no-cache 强制所有缓存了该响应的用户,在使用已缓存的数据前,发送带验证器(判断是否更新)的请求到服务器。不是字面意思上的不缓存
- no-store 禁止缓存,每次请求都要向服务器重新获取数据
ETag
ETag(实体标识)是为了解决几个Last-Modified比较难解决的问题而设计的,它对于每一个url生成唯一的值,资源变化时ETag也发生变化。
参考博文:https://www.cnblogs.com/ranyonsue/p/8918908.html