HTTP缓存

先用一张图来解释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