HTTP缓存相关的精彩文章

掘金学习链接:

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只能精确到秒

-------------要说再见啦感谢大佬的光临~-------------