HTTP缓存是因为很多请求的资源有可能已经获得了,那这个时候就没有必要再重复获取了,可以直接在本地服务器获得该资源,缓存可以大幅度降低连接之间的请求资源的时间,带宽等。但是HTTP协议需要一些规定去限定获得资源的时效性。HTTP缓存分为强制缓存和协商缓存

强制缓存

强制缓存主要判断点在浏览器也就是客户端。客户端会判断缓存是否过期,没有过期直接返回浏览器的本地缓存。
实现字段Cache-ControlExpires. Cache-Control是一个相对时间,而Expires是绝对时间。Cache-Control是比Expires更好用的,因为绝对时间用的是GMT,这个可能会由于不同浏览器设置的时区不同导致同步资源的时间出错。
实现流程

  1. 浏览器第一次请求访问资源时,服务器返回资源会在响应头上加上Cache-Control字段,设置过期时间。
  2. 浏览器再次访问资源时,会将请求资源的时间和Cache-Control设置的时间进行比对,如果小于该时间,就可以直接拿到缓存的资源
  3. 如果资源过期了,再次请求服务器,获得新的Cache-control

然而这种强制缓存的方法,可能导致即使在本地的比较时效性是有效的,但是在比对的过程中,服务器资源发生了改变。因此还需要使用协商缓存

协商缓存

由服务器和客户端共同协商的缓存机制。也就是每次请求时,会带着If-Modified-SinceIf-None-Match给到服务器,如果服务器比对成功了,验证客户端本地资源缓存没有过期,就会返回304状态码,客户端可以直接使用本地缓存的资源

实现字段:

  1. If-Modified-SinceLast-Modified. 响应头部这个字段会标识这个资源最后的修改时间。请求头部会带着上一次响应给的If-Modified-Since: Last-Modified这个字段给到服务器。对比之后如果发现过期了,会返回200 OK以及带着最新的Last-Modified字段。如果没有过期直接返回304
  2. If-None-MatchETag。上面所有的字段都是和时间相关的,这种可能会导致秒级别的误差,因为使用一个唯一标识符ETag。每次客户端发送请求,会携带着资源的etag,服务器接收后比较客户端的etag和自己最新资源的etag,如果不同返回新资源和新etag。如果相同直接返回304

![[Pasted image 20241028171956.png]]