http缓存的好处
浏览器访问一个页面时是通过http请求访问服务器资源,服务器返回资源给浏览器,但是页面中的一些资源比如(图片)可以存储在本地缓存中,当浏览器下一次去访问的时候先在本地缓存中查询,查询不到后再去请求服务器。这样可以大大减少服务器的负担以及页面流畅度。
强缓存
强缓存是指不需要请求服务器,直接使用本地缓存中的资源,它靠响应头部的Expires和Cache-control字段值。
- Expires(绝对时间)
见下图
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/add7bacac1d4ec8973fd86b7cbec291e.png)
浏览器第一次访问某个页面资源时,会在http响应头部中返回Expires这个头,浏览器再次访问时,会在本地缓存中找到这个资源,然后比较它的Expires和当前请求时间大小,如果当前请求时间在Expires之前,则命中缓存;(不是很懂为甚么在之前就命中缓存)如果没有命中缓存,浏览器向服务端请求资源时,会更新Expires头部大小。 - Cache-control(相对时间)
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/356ed41ca367c75e33436601bed99892.png)
绝对时间可能会引起当修改了客户端时间之后,可能会引起命中缓存的结果,所以有了相对时间;这个响应头表示当浏览器第二次访问这个资源时,在接下来的这个时间内都可以使用本地缓存,超出了这个时间后,则不能命中缓存;
协商缓存
协商缓存是指浏览器不知道要不要使用本地缓存资源,所以去请求服务器;当强缓存没有被命中时,协商缓存就出现了;分成两对响应头。
- Last-modified & if-modified-since
浏览器第一次访问某一个页面资源时会有Last-modified这个头部,表示资源最后一次更新的时间,第二次访问时会加上 if-modified-since头部,这是上一次访问响应头部中的last-modified的值,与这次的last-modified作比较,如果一样,则表示资源没有更新,那么服务端返回304,但不用返回资源。 - Etag & if-none-match
上面那种有可能出现的问题是资源更新了,但是最后修改时间没有更新;所以又加了Etag & if-none-match这一对头部,Etag是指第一次访问资源时针对该资源生成的唯一标识符,资源变化后,Etag也会变, if-none-match是上一次访问响应头部中Etag的值,所以第二次访问比较这两个头部是否一样,不一样,资源改变了,服务器就得重新返回资源。