🗒️条件请求
Last updated
Last updated
过期的 response 不会被立即丢弃,可以询问 origin server 把 stale 变成 fresh 的,即 HTTP 的重新验证机制。重新验证是通过条件请求来完成的。
在用 Cache-Control
做缓存控制的时候,很多时候浏览器在使用前还必须去服务器验证是否是最新版。即先发一个 HEAD 请求,来获取资源的修改时间等元信息,然后再与缓存数据进行比较:如果没有改动就使用缓存,否则就再发一个 GET 请求,获取最新的版本。
然而,两个请求的网络成本太高了,所以 HTTP 协议就定义了一系列头字段,专门用来检查资源是否过期,从而把两个请求才能完成的工作合并在一个请求里做。而且,验证的责任也交给服务器,浏览器只需坐享其成。
第一次的响应报文,预先提供 Last-modified
和 ETag
第二次请求时,就可以带上缓存里的原值,验证资源是否是最新的
如果资源没有变,服务器就回应一个 304 Not Modified
,表示缓存依然有效,浏览器就可以更新一下有效期,然后放心大胆地使用缓存了
Last-modified
文件的最后修改时间
ETag
Entity Tag,实体标签,是资源的唯一标识 用来解决“修改时间无法准确区分文件变化”的问题 ETag 有强弱之分
If-Modified-Since If-None-Match
验证资源否失效
If-Unmodified-Since
If-Match
If-Range