特性
- 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特点
- Last-Modified只能精确到秒,秒之内的内容更新Etag才能检测
- 文件有时会定时重新生成相同内容,Last-Modified不能很好辨别
- etag每次服务端生成都需要进行读写操作,而last-modified只需要读取操作,etag的消耗是更大的
Etag/If-None-Match例子
-
第一次请求
image.png
2.第二次请求
通过实验可以清晰看到这个请求头是怎么起作用的
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
网友评论