第 157 题:浏览器缓存 ETag 里的值是怎么生成的
HTTP 协议规格说明定义 ETag 为 被请求变量的实体值。另一种说法是,ETag 是一个可以与 Web 资源关联的记号(token)。典型的 Web 资源可以一个 Web 页,但也可能是 JSON 或 XML 文档。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
Etag 是一个文件变换就要重新生成的一个值,如果用hash来计算达不到效率
不过http也没有明确指出它的计算方式吧
不过在nginx里面,是由Last-Modified和content-length的十六进制组合而成
这样想来是个Etag加强版本的Last-Modified,毕竟Last-Modified是个时间戳,只能精确到秒
1. Nginx 的 ETag 生成方式:http://lxr.nginx.org/source/src/http/ngx_http_core_module.c
注意:行1608、1609
2. Apache 的生成方式 http://httpd.apache.org/docs/2.2/mod/core.html
关于配置里提到的 inode,不知道的可以参考:http://www.ruanyifeng.com/blog/2011/12/inode.html
不同 Web 服务器或者 CDN 的 ETag 生成方式可能不一样。
Etag是服务器响应请求时,返回当前资源文件的一个唯一标识(由服务器生成)。
语法:
'W/'(大小写敏感)
表示使用弱验证器,可选。 弱验证器很容易生成,但不利于比较。 强验证器是比较的理想选择,但很难有效地生成。 相同资源的两个弱Etag值可能语义等同,但不是每个字节都相同。
"<etag_value>"
实体标签唯一地表示所请求的资源。 它们是位于双引号之间的ASCII字符串(如“675af34563dc-tr34”)。 没有明确指定生成ETag值的方法。 通常,使用内容的散列,最后修改时间戳的哈希值,或简单地使用版本号。 例如,MDN使用wiki内容的十六进制数字的哈希值。