ETag 和 Last-Modified, 协商缓存。 文件hash和时间戳

特性

  • ETag和If-None-Match是一对;Last-Modified和If-Modified-Since是一对
  • 它们都属于协商缓存,对内容的有效性进行验证,具体看这里
  • 验证的过程是类似(以Etag为例):首次请求,如果response header含有Etag值,则下一次请求,request header 就会带上If-None-Match,它的值为上次接收到服务器发来的Etag的值。服务器接收到这个值和自身现在的Etag比较,来判断内容是否有变化。如果没变化则返回请求头304,有变化则重新从服务器获取内容,成功的话返回200和内容。这个过程是浏览器自动完成的。
  • 生成值的方法不同: Etag的值通常为文件内容的哈希值;而Last-Modified为最后修改的时间。

ETag特点

  1. Last-Modified只能精确到秒,秒之内的内容更新Etag才能检测
  2. 文件有时会定时重新生成相同内容,Last-Modified不能很好辨别
  3. etag每次服务端生成都需要进行读写操作,而last-modified只需要读取操作,etag的消耗是更大的

Etag/If-None-Match例子

  1. 第一次请求
image.png

2.第二次请求


image.png

通过实验可以清晰看到这个请求头是怎么起作用的

Last-Modified/If-Modified-Since

与上面类似,具体请对照实验

304

如上面所示,304状态码出现在协商缓存,进行缓存内容有效性验证的时候。如果缓存内容被服务端认定没有变化,则只返回response header,并把状态码设置为304,并不返回response body,浏览器再收到304的时候,从本地的缓存中读取内容。如果内容有变,则返回新的header和body。可见,304在缓存中的作用最后体现在少返回了一次内容上。

参考资料:

http://www.telerik.com/blogs/understanding-http-304-responses
https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/ETag

作者:donnylin
链接:https://www.jianshu.com/p/b5c805f4e8d1
來源:
著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

你可能感兴趣的:(ETag 和 Last-Modified, 协商缓存。 文件hash和时间戳)