整体流程如下:
检查是否过期
- 首先检查是否过期(Expires http1.0 CachControl:Maxage),如果没有过期,直接读缓存
- 如果过期,查看是否有ETag,如果有,传递IF-None-Match:ETag的值 和服务器的ETag比对,如果一样,则返回304请求,浏览器直接从缓存中拿数据
- 如果没有ETag,查看请求资源是否有lastmodifytime,如果没有直接从服务器从新请求数据
- 如果有,则请求头中加上If-modify-Since:上次修改时间,然后服务器和资源最近的修改时间进行比对,如果最近修改时间比较新,所以修改过,则重新返回200,如果相等,则返回304
为什么有了Lastmodifytime还要有Etag
因为Lastmodify只能精确到秒,但是Etag也是有问题的,分布式系统中,每个系统的静态文件,算出来的Etag值是不相等的