作者回复: 总结的非常好。
第三点感觉有点问题,cache缓存的是完整的报文,不单单是body。
作者回复: 对,没有条件请求头,那么服务器就无法处理缓存,就只能返回最新的数据。
作者回复: great。
作者回复: 1.强制刷新请求最新的资源,没有条件请求,所以不会有304,都是200。
2.每个浏览器可能会有不同,但基本的字段是一样的。
3.缓存的位置不一样,浏览器会分别存放到内存或者硬盘上,所以会显示来源不同。
4.http只规定了缓存的用法,具体如何存放如何使用就是客户端自己灵活实现了,怎么方便怎么来。
5.过期后去验证,如果服务器返回304,那么就可以继续重用缓存,而不用下载整个资源。
6.可以看一下流程图,不是所以的属性都能共存的。当然如果你要是都写上也不是不可以,那浏览器就会“精神错乱”了。
作者回复: 回答正确,之前是我弄错了。
作者回复: 刷新时发的是条件请求,不是普通的请求,所以就必须返回304,告诉浏览器内容没有过期,可以继续用缓存。
普通请求才会直接检查缓存,然后是200 cacahe from disk。
作者回复: Nginx和Apache都有etag,但算法不同,但都不会用特别消耗计算资源的算法。
其他的web服务器就不太清楚了。
作者回复: 不一样,如果服务器返回304,是一个很小的报文,这样浏览器就可以直接重用缓存里的数据,可以节约传输带宽。
nostore每次都会传输完整的报文,成本高。
作者回复: 会获得最新的数据,但如果数据不变就直接走缓存,服务器返回304,省去了再次传输数据的成本。
作者回复: 这张图是“服务器”的缓存策略,也就是说服务器应该如何设置资源的缓存参数,并不是客户端判断缓存的流程。
只要不是no-store就必然会设置max-age,所以must-revalidate是max-age的一个附加条件。
作者回复: 缓存策略取决于服务器,它认为这个缓存只能存放在客户端,不能存放在代理上,就设置private。
与session无关。
作者回复: 是的,缓存当然是只对获取文件有效,从服务器上拿到文件然后放入本地缓存。
作者回复: http标准没有规定必须要存储在内存或磁盘,如何存储都是由客户端(浏览器)自己决定的。
我觉得这种说法不准确,其实缓存都会落盘存储,但有的可能会在内存里也放一份,加快访问速度。
作者回复: 实际的应用场景我也暂时没见到,但last-modified从运行机制上是存在这个问题的。
举个不恰当的例子,比如说某个应用的log,开放http接口获取在web上展示,如果log更新频繁,那么就应该用etag。
作者回复: cache-control是管理缓存,不是决定验证的。
验证的条件是modified-date和etag,由条件请求发起验证。
作者回复: 强etag和etag的流程都是一样的,只是计算的方式不同,(即判断是否发生变化的方式不同)。
你的理解正确。
作者回复: http协议里没有对缓存过期后如何处理作出规定,但一般浏览器在过期后还可以再保存更长的时间,这个时候缓存就出于stale(陈旧)状态。
浏览器也可以按照某种策略清理缓存,例如LRU,或者显得缓存的总大小。
如果本地缓存没有了,浏览器显然就不需要考虑缓存特性了,直接向服务器获取最新的数据。
作者回复: 看发送的请求
作者回复: 可以用开发者工具观察一下http请求和响应,看看请求里是否有max-age=0这样的强制刷新字段。
作者回复: “超市”就是服务器,它必定有资源的最新版本。
还是不能完全用生活来类别http协议,这个比喻可能会让你有些误解,抱歉。