http缓存机制探索和疑问

最近在某一次面试中问到了关于浏览器缓存的问题,特此记录一下,以及发现的一些疑问

这里写图片描述
此篇文章中会遇到的几个名词:cache-control、lastmodify/etag
先说说cache-control,有的同学会问为什么不说expires,这边说明下在http1.1中以cache-control为准,cache-control有很多种值,具体可以百度,这里只说cache-control的使用,在第一次访问一个页面时会从服务器取到一些js、css文件,这时返回的httpcode是200,表示成功从服务器获取到。在第一次访问后,服务器会返回文件缓存的时间expires、max-age等表示过期时间的数值给到客户端,客户端会连文件和这些信息一起缓存在浏览器,在第二次请求时,会判断缓存时间是否过期,如果没过期则会直接从本地获取缓存的css、js等文件,这个过程是不发送http请求的,也就是没有网络依然可以获取到。如果缓存过期则还是会发送http请求到服务器,但是并不是每次都会重新抓取服务器文件并返回,这就要牵涉到lastmodify和etag的问题了。
Lastmodify无法从请求头和响应头中看到,它不显示,但是在第一次请求是会返回给客户端,然后客户端在下一次请求是在requestheader的if-modified-since中传递给服务端,服务端接手后会去和lastmodify做判断,如果一致则返回304,如果不一致则返回200并从新拉取文件。这样做的好处是,可以在文件没有更改但缓存过期的时候避免传递同样的文件给客户端,节约了带宽。
既然已经有lastmodify和cache-control控制了客户端和服务端的缓存,那etag有什么用呢?etag其实是来弥补lastmodify的坑的。假设一种情况,你删掉了文件中的一个空行,导致文件的修改时间变化了,那就会导致lastmodify判断失败进而从新拉取文件浪费带宽,因为实际内容根本没变,而如果开启了etag,则etag会使用一种算法去计算出一个hash值,随后返回给客户端,客户端再一次请求将此值放入if-none-match穿给服务端,服务端判断如果一致则返回304,避免返回文件实体。
最后,我看了一些网上的文章,文章说道如果同时开启etag和lastmodify,那服务器会同时判断这两个值是否一致才决定是否返回304。我认为这种说法有一定问题,因为假设一个文件修改了一个地方但没有改变文件实际内容,则etag是不会变的,但是lastmodify却变化了,如果同时判断两个的值是否变化,那结果一定是false,那还是会返回code200,这样的etag就没有意义了。 所以我的观点是,服务器先观察是否有etag,如果有etag则只判断etag,如果没有才会去判断lastmodify。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值