背景
-
ETag和If-None-Match是一对;Last-Modified和If-Modified-Since是一对
-
它们都属于协商缓存,对内容的有效性进行验证
-
验证的过程是类似(以Etag为例):首次请求,如果response header含有Etag值,则下一次请求,request header 就会带上If-None-Match,它的值为上次接收到服务器发来的Etag的值。服务器接收到这个值和自身现在的Etag比较,来判断内容是否有变化。如果没变化则返回请求头304,有变化则重新从服务器获取内容,成功的话返回200和内容。这个过程是浏览器自动完成的。
-
Last-Modified是通过最后一次修改时间来判断资源是否发生改变Etag是用过hash内容对比判断是否资源发生改变
区别 既然有了Last-Modified为什么要用Etag
- Last-Modified只能精确到秒,秒之内的内容更新Etag才能检测
- 文件有时会定时重新生成相同内容,Last-Modified不能很好辨别
- etag每次服务端生成都需要进行读写操作,而last-modified只需要读取操作,etag的消耗是更大的
- 生成值的方法不同: Etag的值通常为文件内容的哈希值;而Last-Modified为最后修改的时间。
Last-Modified以秒为单位,如果不超过1s内不会检测到资源发送改变。- 资源走完一个生命周期回到原来的状态,其实没发生改变,但会会判断发生改变。
- 因为ETagd的
hash值内容是唯一的,通过对比就很快知道资源是否发送改变。