HTTP 缓存机制

1 Expires

通过 Expires 在 HTTP 响应头中设定缓存时间;如,在 Nginx 在配置。

2 Cache-Control

HTTP1.1 协议中的,因为有了它,所以可以忽略上面提到的 Expires。因为 Cache-Control 相对于 Expires 更加具体,细致。

且,就算同时设置了 Cache-Control 和 Expires,Cache-Control 的优先级也高于 Expires。

下面就来看看,Cache-Control 响应头中常用字段的具体含义:

(1)max-age:用来设置资源(representations)可以被缓存多长时间,单位为秒;

(2)s-maxage:和max-age是一样的,不过它只针对代理服务器缓存而言;

(3)public:指示响应可被任何缓存区缓存;

(4)private:只能针对个人用户,而不能被代理服务器缓存;

(5)no-cache:强制客户端直接向服务器发送请求,也就是说每次请求都必须向服务器发送。服务器接收到请求,然后判断资源是否变更,是则返回新内容,否则返回 304,未变更。这个很容易让人产生误解,使人误以为是响应不被缓存。实际上 Cache-Control: no-cache 是会被缓存的,只不过每次在向客户端(浏览器)提供响应数据时,缓存都要向服务器评估缓存响应的有效性。

(6)no-store:禁止一切缓存(这个才是响应不被缓存的意思)。

3 Etag & If-None-Match

HTTP/1.1 200 OK
Date: Fri, 30 Oct 1998 13:19:41 GMT
Server: Apache/1.3.3 (Unix)
Cache-Control: max-age=3600, must-revalidate
Expires: Fri, 30 Oct 1998 14:19:41 GMT
Last-Modified: Mon, 29 Jun 1998 02:28:12 GMT
ETag: "3e86-410-3596fbbc"
Content-Length: 1040
Content-Type: text/html

Etag 是属于 HTTP 1.1 属性,它是由服务器生成返回给前端,

当你第一次发起 HTTP 请求时,服务器会返回一个 Etag,

HTTP 缓存机制_第1张图片
第一次请求 生成Etag

并在你第二次发起同一个请求时,客户端会同时发送一个 If-None-Match,而它的值就是 Etag 的值(此处由发起请求的客户端来设置)。

HTTP 缓存机制_第2张图片
第二次请求

然后, 服务器会比对这个客服端发送过来的 Etag 是否与服务器的相同,

如果相同,就将 If-None-Match 的值设为 false,返回状态为 304,客户端继续使用本地缓存,不解析服务器返回的数据(这种场景服务器也不返回数据,因为服务器的数据没有变化嘛)

HTTP 缓存机制_第3张图片

如果不相同,就将 If-None-Match的值设为true,返回状态为200,客户端重新解析服务器返回的数据

说白了,ETag 实体标签: 一般为资源实体的哈希值,即 ETag 就是服务器生成的一个标记,用来标识返回值是否有变化,且 Etag 的优先级高于 Last-Modified、Expires。

HTTP 缓存机制_第4张图片

参考:
https://www.cnblogs.com/softidea/p/5986339.html

你可能感兴趣的:(HTTP 缓存机制)