wuyuedefeng / blogs

博客文章在issue中
5 stars 0 forks source link

http缓存机制 #138

Open wuyuedefeng opened 1 year ago

wuyuedefeng commented 1 year ago

强缓存是利用 http 的返回头中的 Expires 或者 Cache-Control 来表示资源的缓存时间,不会向服务器发送请求,状态码为 200。

协商缓存则需要向服务器发送请求,根据一些值判断是否命中缓存,命中则状态码为304。

强缓存

Expires

该字段是 http1.0 时的规范,它的值为一个绝对时间的 GMT 格式的时间字符串,比如 Expires:Mon,18 Oct 2066 23:59:59 GMT(是一个绝对时间)。这个时间代表着这个资源的失效时间。缺点是当服务器与客户端时间偏差较大时,就会导致缓存混乱。

Cache-Control

cache-control 是 http1.1 时出现的 header 信息,主要是利用该字段的 max-age 值来进行判断,它是一个相对时间,例如 Cache-Control:max-age=3600,代表着资源的有效期是3600秒。cache-control 除了该字段外,还有下面几个比较常用的设置值:

no-cache:不使用本地缓存

no-store:禁止缓存数据,每次用户请求该资源,都会向服务器发送一个请求,每次都会下载完整的资源

public:可以被所有的用户缓存,包括终端用户和 CDN 等中间代理服务器。

private:只能被终端用户的浏览器缓存,不允许 CDN 等中继缓存服务器对其缓存。

Cache-Control 与 Expires 可以在服务端配置同时启用,同时启用的时候 Cache-Control 优先级高。

协商缓存

Last-Modify/If-Modify-Since

浏览器第一次请求一个资源的时候,服务器返回的 header 中会加上 Last-Modified,Last-Modified 是一个时间,标识该资源的最后修改时间,例如 Last-Modified: Thu,31 Dec 2037 23:59:59 GMT。

当浏览器再次请求该资源时,request 的请求头中会包含 If-Modified-Since,该值为缓存之前返回的 Last-Modified。服务器收到 If-Modified-Since 后,根据资源的最后修改时间判断是否命中缓存。

如果命中缓存,则返回304,并且不会返回资源内容,并且不会返回 Last-Modified。没有命中缓存则和从最初的请求一样,状态码 200。

ETag/If-None-Match

ETag 返回的是一个校验码,可以保证每一个资源是唯一的,资源变化都会导致 ETag 变化。服务器根据浏览器发送的 If-None-Match 值来判断是否命中缓存。

与 Last-Modified 不一样的是,当服务器返回 304 的响应时,由于 ETag 重新生成过,response header 中还会把这个 ETag 返回,即使这个 ETag 跟之前的没有变化。

当 Etag 和 Last-Modify 同时存在则优先校验 ETag,ETag 可以校验秒级别的文件修改,更加精确。


引自: