http缓存之基本概念

104 阅读3分钟

img

一、什么是HTTP缓存 ?

http缓存指的是: 当客户端向服务器请求资源时,会先抵达浏览器缓存,如果浏览器有“要请求资源”的副本,就可以直接从浏览器缓存中提取而不是从原始服务器中提取这个资源。

常见的http缓存只能缓存get请求响应的资源,对于其他类型的响应则无能为力,所以后续说的请求缓存都是指GET请求。

http缓存都是从第二次请求开始的。第一次请求资源时,服务器返回资源,并在respone header头中回传资源的缓存参数;第二次请求时,浏览器判断这些请求参数,命中强缓存就直接200,否则就把请求参数加到request header头中传给服务器,看是否命中协商缓存,命中则返回304,否则服务器会返回新的资源。

强制缓存

可以由这两个字段其中一个决定

  • expires
  • cache-control(优先级更高) cache-controlexpires效果差不多,只不过这两个字段设置的值不一样而已,前者设置的是秒数,后者设置的是毫秒数

如果开启了强缓存,并且在过期时间之内,则浏览器不再发起请求,直接使用本地的缓存资源。

Expires

指定一个明确的时间点作为缓存资源的过期时间,客户端会根据此时间点来判断到底使用本地缓存,还是向服务器重新请求资源。如果客户端修改了本地时间,将会影响对缓存的判断。

Cache-control 以便更精准地控制缓存。此首部信息 具有最高的优先级。

描述
no-store禁止浏览器以及所有中间缓存存储任何版本的返回响应。每次用户都会向服务器发送请求,并下载完整的响应。
no-cache先与服务器确认返回的响应是否变化,如果资源未发生变化,则可使用缓存副本从而避免下载。
max-age指定从请求的时刻开始计算,此响应的缓存副本有效的最长时间 (单位:s)
public响应可以被浏览器以及中间缓存无限期缓存
private响应可以被浏览器缓存,但是不允许任何中间缓存器对其进行缓存。
协商缓存
  • Last-Modified,If-Modified-Since 对比资源最后一次修改时间,来确定资源是否修改了
  • Etag,If-None-Match(优先级更高)对比资源内容,来确定资源是否修改

浏览器本地是有缓存的,但是要先发起请求,由服务器判断缓存是否过期。

如果需要使用协商缓存,需要 将 Cache-control 指定为 no-cache 或者 max-age 、Expires 均过期之后。

Last-Modified

是服务器端在响应请求时用来说明资源的最后修改时间。内容没变化,时间变化了,也会被认为是变化。

If-Modified-Since

是服务器为资源分配的字符串形式唯一性标识,作为响应首部返回给浏览器。采用弱比较,内容没变化,时间变化了,会认为是资源未变化。

不同点

强缓存是在时效时间内,不走服务端,只走本地缓存;而协商缓存是要走服务端的,如果请求某个资源,去请求服务端时,发现命中缓存则返回304,否则则返回所请求的资源

www.jianshu.com/p/7b4820fff…

www.jianshu.com/p/227cee9c8…