掘金学习链接:
https://juejin.im/post/5a673af06fb9a01c927ed880
https://juejin.im/post/5c136bd16fb9a049d37efc47
强缓存相关字段:
Pragma
: 仅作为HTTP/1.0
向后兼容, 为通用请求头首部字段,RFC
中该字段只有no-cache
一个可选值Cache-Control
Expires
Cache-Control
为非0的max-age或者设置了大于请求日期的Expires才有可能命中强缓存(同时时设置了Expires和max-age,则Expires会被忽略)
当满足这个条件,同时响应报文首部中Cache-Control不存在no-cache、no-store且请求报文首部不存在Pragma字段,才会真正命中强缓存
协商缓存相关字段:
Last-Modified
(Response Header)/If-Modified-Since
(Rquest Header)If-Modified-Since
是一个请求首部字段,并且只能用在GET或者HEAD请求中。Last-Modified
是一个响应首部字段,包含服务器认定的资源作出修改的日期及时间。当带着If-Modified-Since
头访问服务器请求资源时,服务器会检查Last-Modified
,如果Last-Modified
的时间早于或等于If-Modified-Since
则会返回一个不带主体的304
响应,否则将重新返回资源ETag
(Response Header)/If-None-Match
(Rquest Header)ETag
是一个响应首部字段,它是根据实体内容生成的一段hash
字符串,标识资源的状态,由服务端产生。If-None-Match
是一个条件式的请求首部。如果请求资源时在请求首部加上这个字段,值为之前服务器端返回的资源上的ETag
,则当且仅当服务器上没有任何资源的ETag
属性值与这个首部中列出的时候,服务器才会返回带有所请求资源实体的200响应,否则服务器会返回不带实体的304
响应。ETag
优先级比Last-Modified
高,同时存在时会以ETag
为准。ETag属性之间的比较采用的是弱比较算法,即两个文件除了每个比特都相同外,内容一致也可以认为是相同的。例如,如果两个页面仅仅在页脚的生成时间有所不同,就可以认为二者是相同的。
因为ETag
的特性,所以相较于Last-Modified
有一些优势:
某些情况下服务器无法获取资源的最后修改时间
资源的最后修改时间变了但是内容没变,使用
ETag
可以正确缓存如果资源修改非常频繁,在秒以下的时间进行修改,
Last-Modified
只能精确到秒