最近回顾HTTP缓存知识的时候发现了一个问题,设置了强缓存和协商缓存的文件,点击浏览器的刷新按钮的时候在chrome和firefox中的表现不一样。具体表现为chrome走强缓存没有再次发起请求。firefox却在强缓存没有失效的情况下发了请求,返回了304走了协商缓存。
chrome请求截图:
firefox请求截图:
上面两种表现截然相反,但是并没有错误。主要原因在于浏览器点击刷新按钮时是否使用强缓存的实现各个浏览器不同。参考盗图如下:
通过测试发现firefox的http缓存完全符合上图描述,所以不是firefox的强缓存失效,而是在firefox中本来点击刷新按钮就应该忽略强缓存。而chrome刷新按钮使用强缓存是对http缓存的一种优化。所以两者应该都是对的。
在firefox没有304的验证在目前来说还是很有用的,现在大部分网页都是工程化的结果,打包出来的文件名称都带上了hash,只要内容变了那么文件名一定会变化,反过来说文件名没有变那么内容一定没有改变,再去验证304就少了很多必要。
关于304的非必要性,详情可查参考1。
参考
[译] 这项浏览器调整使 Facebook 收到的网络请求减少了 60%
彻底理解浏览器缓存机制
http协议请求响应头中参数的疑问??
浏览器缓存机制