作者回复: 总结的非常好。
第三点感觉有点问题,cache缓存的是完整的报文,不单单是body。
作者回复: 1.强制刷新请求最新的资源,没有条件请求,所以不会有304,都是200。
2.每个浏览器可能会有不同,但基本的字段是一样的。
3.缓存的位置不一样,浏览器会分别存放到内存或者硬盘上,所以会显示来源不同。
4.http只规定了缓存的用法,具体如何存放如何使用就是客户端自己灵活实现了,怎么方便怎么来。
5.过期后去验证,如果服务器返回304,那么就可以继续重用缓存,而不用下载整个资源。
6.可以看一下流程图,不是所以的属性都能共存的。当然如果你要是都写上也不是不可以,那浏览器就会“精神错乱”了。
作者回复: 对,没有条件请求头,那么服务器就无法处理缓存,就只能返回最新的数据。
作者回复: great。
作者回复: 回答正确,之前是我弄错了。
作者回复: 刷新时发的是条件请求,不是普通的请求,所以就必须返回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的流程都是一样的,只是计算的方式不同,(即判断是否发生变化的方式不同)。
你的理解正确。
作者回复: 是的,发现有缓存,但过期就要发个条件请求,看缓存是否可用,再用max-age更新一下。
作者回复:
1.date就是报文离开服务器的时间,max-age依赖date字段。
2.last-modified-since和if-none-match两个条件只要给出就会验证,有变化就会返回新的。
作者回复: 每个服务器的etag生成算法不一样,可以参考小贴士。