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,
第一次请求 生成Etag并在你第二次发起同一个请求时,客户端会同时发送一个 If-None-Match,而它的值就是 Etag 的值(此处由发起请求的客户端来设置)。
然后,服务器会比对这个客服端发送过来的 Etag 是否与服务器的相同,
如果相同,就将 If-None-Match 的值设为 false,返回状态为 304,客户端继续使用本地缓存,不解析服务器返回的数据(这种场景服务器也不返回数据,因为服务器的数据没有变化嘛)
如果不相同,就将 If-None-Match的值设为true,返回状态为200,客户端重新解析服务器返回的数据
说白了,ETag 实体标签: 一般为资源实体的哈希值,即 ETag 就是服务器生成的一个标记,用来标识返回值是否有变化,且 Etag 的优先级高于 Last-Modified、Expires。
网友评论