上面提到的immutable也是Cache-Control的一个属性,但是是个实验性质的,各个浏览器兼容并不好。设置了Cache-control: immutable表示这辈子都用缓存了,再请求是不可能的了。
其他常用属性还有:
no-cache:使用缓存前,强制要求把请求提交给服务器进行验证(协商缓存验证)。
no-store:不存储有关客户端请求或服务器响应的任何内容,即不使用任何缓存。
另外Cache-Control还有很多属性,大家可以参考MDN的文档。
Expires和Cache-Control的优先级就一句话:如果在Cache-Control响应头设置了 max-age 或者 s-maxage 指令,那么 Expires 头会被忽略。
协商缓存和强制缓存优先级这个其实很好理解,协商缓存需要发请求跟服务器协商,强制缓存如果生效,根本就不会发请求。所以这个优先级就是:先判断强制缓存,如果强制缓存生效,直接使用缓存;如果强制缓存失效,再发请求跟服务器协商,看要不要使用缓存。
总结本文从生活中常见的场景入手,阐述了HTTP缓存机制其实是提高访问速度和解决信息不同步的一种机制。这种信息不同步在生活中很常见,很多解决思路我们已经司空见惯,带着这种思维,我们可以很好的理解HTTP缓存机制。HTTP缓存机制要点如下:
HTTP缓存机制分为强制缓存和协商缓存两类。
强制缓存的意思就是不要问了(不发起请求),直接用缓存吧。
强制缓存常见技术有Expires和Cache-Control。
Expires的值是一个时间,表示这个时间前缓存都有效,都不需要发起请求。
Cache-Control有很多属性值,常用属性max-age设置了缓存有效的时间长度,单位为秒,这个时间没到,都不用发起请求。
immutable也是Cache-Control的一个属性,表示这个资源这辈子都不用再请求了,但是他兼容性不好,Cache-Control其他属性可以参考MDN的文档。
Cache-Control的max-age优先级比Expires高。
协商缓存常见技术有ETag和Last-Modified。
ETag其实就是给资源算一个hash值或者版本号,对应的常用request header为If-None-Match。
Last-Modified其实就是加上资源修改的时间,对应的常用request header为If-Modified-Since,精度为秒。
ETag每次修改都会改变,而Last-Modified的精度只到秒,所以ETag更准确,优先级更高,但是需要计算,所以服务端开销更大。
强制缓存和协商缓存都存在的情况下,先判断强制缓存是否生效,如果生效,不用发起请求,直接用缓存。如果强制缓存不生效再发起请求判断协商缓存。
参考资料:ETag MDN文档:https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/ETag
Last-Modified MDN文档:https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Last-Modified
Expires MDN文档:https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Expires
Cache-Control MDN文档:https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Cache-Control
文章的最后,感谢你花费宝贵的时间阅读本文,如果本文给了你一点点帮助或者启发,请不要吝啬你的赞和GitHub小星星,你的支持是作者持续创作的动力。