学习记录之HTTP缓存

126 阅读3分钟

这是我用来记录日常学习的成果,不能尽善尽美,如果有遗漏差错之处还请朋友指正

简介

HTTP缓存又称为浏览器缓存,HTTP缓存分为两种:强缓存和协商缓存。缓存是为了提高资源的访问速度、减少网络传输、缓解服务器的压力。

HTTP缓存的两种策略:强缓存和协商缓存

强缓存

运行流程

强制缓存.png

协商缓存

运行流程

协商缓存.png

缓存控制

HTTP/1.1定义的 Cache-Control 头用来区分对缓存机制的支持情况,请求头和响应头都支持这个属性。通过它提供的不同的值来定义缓存策略

Cache-Control

Cache-Control: no-store  浏览器不设置缓存,每次都会向服务器请求最新的数据
Cache-Control: no-cache 浏览器设置缓存,且为协商缓存
Cache-Control: private 默认,只允许私人(浏览器)缓存,不允许中间代理、CDN缓存
Cache-Control: public 允许中间代理、CDN缓存

过期

Cache-Control: max-age=31536000 距离过期的秒数
Cache-Control: s-maxage=31536000 覆盖`max-age`或者`Expires`头,但是仅适用于共享缓存 (比如各个代理),私有缓存会忽略它。
Expires: Wed, 21 Oct 2015 07:28:00 GMT  过期的时间,max-age和s-maxage会覆盖它

协商缓存控制

弱校验器

Last-Modified: Tue, 28 Jun 2022 07:27:46 GMT 响应头,包含服务器认定的资源做出修改的日期及时间
If-Modified-Since: Mon, 27 Jun 2022 08:28:06 GMT 请求头,只能用于GET、HEAD请求,浏览器会将响应的Last-Modified的日期作为If-Modified-Since的日期发往服务器

强校验器

ETag: 资源的hash值 响应头,是资源的特定版本的标识符,如果资源的内容发生改变,则ETag也会改变
If-None-Match: 请求头,只能用于GET、HEAD请求,浏览器会将ETag的值作为If-None-Match的值发往服务器

Last-Modified VS ETag

Last-Modified 响应头可以作为一种弱校验器。说它弱是因为它只能精确到一秒。如果响应头里含有这个信息,客户端可以在后续的请求中带上 If-Modified-Since 来验证缓存。Last-Modified只是标识文件的修改日期,如果文件日期修改了,但是内容不变,服务器也会认为资源更新了,重新返回响应数据,造成不必要的传输

ETage作为缓存的一种强校验器,如果资源请求的响应头里含有 ETag,客户端可以在后续的请求的头中带上 If-None-Match 头来验证缓存。但是ETage的值是由服务器通过hash算法计算得出,精确到内容的每个字节,如果文件内容较大,会耗费服务器的计算资源。

缓存的整个运行流程

http缓存运行流程.png

HTTP缓存流程的注意点

  1. 从运行流程图中,可以知道 强缓存优先级高于协商缓存
  2. 浏览器会从缓存中依次判断max-age --> Expires --> ETage --> Last-Modified ,如果没有则进行下一个判断,说明了这四个属性的优先级从高到低
  3. 如果什么缓存策略都没设置,即没有设置Cache-Control和Expires,但设置了Last-Modified,浏览器会采用一个启发式的算法,通常会取响应头中的 Date 减去 Last-Modified 值的 10% 作为缓存时间,进行强缓存

屏幕截图 2022-06-28 162747.png

参考:MDN/HTTP 缓存