一篇文章带你整明白HTTP缓存知识
最近看了很多关于缓存的文章, 每次看完,看似明白但是实际还是没明白,这次总算搞明白协商缓存是怎么回事了
首先,服务器缓存分强制缓存和协商缓存(也叫对比缓存)
强制缓存一般是服务端在请求头携带字段Expires 来指定过期时间,不过这个字段已经是HTTP1的字段了(也可以使用);
强制缓存还有一个字段是Cache-Control : 这个字段主要值有 no-store no-cache max-age等来设置强制缓存(max-age来设置资源的过期时间)
下面重点需要搞明白的是协商缓存,也就是对比缓存
① 协商缓存发生在强制缓存失效之后,浏览器根据缓存标识决定是否使用缓存的过程
②协商缓存发生的过程如下:
1. 通过 Last-Modified值,和If-Modify-Since字段 判断是否要缓存
-浏览器第一次请求 这时候不会携带缓存标识
-服务器第一次返回 这个时候服务端设置响应头 Last-Modified , 值为最后一次修改时间
-浏览器第一次接收到响应 接收到服务器设置的响应头 响应体等
- 浏览器第二次请求 这个时候浏览器会先检测到Last-Modified 字段,于是发送请求的时候携带If-Modified-Since 请求头,值就是浏览器第一次返回回来的Last-Modified的值;
-服务器第二次接受到请求 这个时候会对比这个值和服务器中这个资源修改时间;如果没有变化则直接返回携带304的响应头和空的响应体,浏览器则直接读取缓存,如果不等(小于服务器上的这个修改时间),说明文件有更新,返回新的资源
-这样缓存目的就达到了
2. 通过浏览器携带的If-None-Match字段和Etag 值判断是否需要缓存
-浏览器第一次请求 这个时候请求头不会携带缓存标识
-服务器第一次响应 这个时候响应头携带Etag字段,值为改资源文件唯一标识(这个值生成有一定规则 掘金有文章写的是last_modified
与 content_length组成
)
- 浏览器第二次发起请求 这个时候浏览器请求头携带If-None-Match字段,值为Etag的值
- 服务器接受到这个请求字段之后,把If-None-Match的值和这个资源的Etag值进行比较,如果不同,则会返回完整的报文信息;如果一致,则只返回带304的响应头,浏览器在缓存中读取缓存的资源
搞明白的方法还是自己笔和纸画出来的,嗯 ,加油;💪