一篇文章带你整明白HTTP缓存知识

348 阅读3分钟

最近看了几篇文章。关于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的响应头,浏览器在缓存中读取缓存的资源

缓存位置

  • 资源被浏览器加载之后会被缓存到磁盘或者内存中

  • 缓存位置分以下四个地方

    1. Service worker
    2. Memory Cache
    3. Disk Cache
    4. Push Cache 一般我们会在浏览器网络调试面板中中看到这几个字段 ;

    网络太慢,就不截图了

搞明白的方法还是自己笔和纸画出来的,嗯 ,加油;💪