Expires
- Expires:Wed, 05 Apr 2017 00:55:35 GMT
即到期时光, 以办事器时光为参考系, 其优先级比 Cache-Control:max-age 低, 两者同时涌如今响应头时, Expires将被后者覆盖. 如不雅Expires, Cache-Control: max-age, 或 Cache-Control:s-maxage 都没有在响应头中出现, 并且也没有其它缓存的设置, 那么浏览器默认会采取一个启发式的算法, 平日会取响应头的Date_value - Last-Modified_value值的10%作为缓存时光.
如下资本便采取了启发式缓存算法.
协商缓存
其缓存时光为 (Date_value - Last-Modified_value) * 10%, 计算如下:
- const Date_value = new Date('Thu, 06 Apr 2017 01:30:56 GMT').getTime();
- const LastModified_value = new Date('Thu, 01 Dec 2016 06:23:23 GMT').getTime();
- const cacheTime = (Date_value - LastModified_value) / 10;
- const Expires_timestamp = Date_value + cacheTime;
- const Expires_value = new Date(Expires_timestamp);
- console.log('Expires:', Expires_value); // Expires: Tue Apr 18 2017 23:25:41 GMT+0800 (CST)
可见该资本将于2017年4月18日23点25分41秒过时, 测验测验以下两步进行验证:
1) 试着把本地时光修改为2017年4月18日23点25分40秒, 敏捷刷新页面, 发明强缓存依然有效(依旧是200 OK (from disk cache)).
3) 将本地时光恢复正常(即 2017-04-06 09:54:19). 刷新页面, 发明Date依然是4月18日, 如下所示.
大年夜⚠ Provisional headers are shown 和Date字段可以看出来, 浏览器并未发出请求, 缓存依然有效, 只不过此时Status Code显示为200 OK. (甚至我还专门打开了charles, 也没有发明该资本的任何请求, 可见这个200 OK若干有些误导人的意味)
可见, 启发式缓存算法采取的缓存时光可长可短, 是以对于惯例资本, 建议明白设置缓存时光(如指定max-age 或 expires).
ETag
- ETag:"fcb82312d92970bdf0d18a4eca08ebc7efede4fe"
实体标签, 办事器资本的独一标识符, 浏览器可以根据ETag值缓存数据, 节俭带宽. 如不雅资本已经改变, etag可以赞助防止同步更新资本的互相覆盖. ETag 优先级比 Last-Modified 高.
If-Match
语法: If-Match: ETag_value 或者 If-Match: ETag_value, ETag_value, …
缓存校验字段, 其值为前次收到的一个或多个etag 值. 常用于断定前提是否知足, 如下两种场景:
- 对于 GET 或 HEAD 请求, 结合 Range 头字段, 它可以包管新范围的要乞降前一个来自雷同的源, 如不雅不匹配, 办事器将返回一个416(Range Not Satisfiable)状况码的响应.
- 对于 PUT 或者其他不安然的请求, If-Match 可用于阻拦缺点的更新操作, 如不雅不匹配, 办事器将返回一个412(Precondition Failed)状况码的响应.
语法: If-None-Match: ETag_value 或者 If-None-Match: ETag_value, ETag_value, …
缓存校验字段, 结合ETag字段, 常用于断定缓存资本是否有效, 优先级比If-Modified-Since高.
- 对于 GET 或 HEAD 请求, 如不雅其etags列表均不匹配, 办事器将返回200状况码的响应, 反之, 将返回304(Not Modified)状况码的响应. 无论是200照样304响应, 都至少返回 Cache-Control, Content-Location, Date, ETag, Expires, and Vary 中之一的字段.
- 对于其他更新办事器资本的请求, 如不雅其etags列表匹配, 办事器将履行更新, 反之, 将返回412(Precondition Failed)状况码的响应.
Last-Modified
语法: Last-Modified: 礼拜,日期 月份 年份 时:分:秒 GMT