HTTP 强 Etag 和 弱 Etag

强校验和弱校验

ETag机制同时支持强校验和弱校验。它们通过ETag标识符的开头是否存在"W/"来区分,如:

"123456789" -- 一个强ETag验证符

W/"123456789" -- 一个弱ETag验证符

强校验的ETag匹配要求两个资源内容的每个字节需完全相同,包括所有其他实体字段(如Content-Language)不发生变化。强ETag允许重新装配和缓存部分响应,以及字节范围请求。 弱校验的ETag匹配要求两个资源在语义上相等,这意味着在实际情况下它们可以互换,而且缓存副本也可以使用。不过这些资源不需要每个字节相同,因此弱ETag不适合字节范围请求。当Web服务器无法生成强ETag的时候,比如动态生成的内容,弱ETag就可能发挥作用了。

强 ETag 值和弱 ETag 值

强ETag值,无论实体发生多么细微的变化都会改变其值。

弱ETag值,只用于提示资源是否相同。只有资源发生了根本改变,产生差异时才会改变ETag的值。

正常(强)ETag和弱ETag之间的区别在于匹配的强ETag保证文件的字节与字节相同,而匹配的弱ETag表示内容在语义上相同。所以如果文件的内容发生变化,那么弱的ETag也会改变。

nodjs etag模块

etag(entity, options)

entity: 可以是String, Buffer, fs.Stats

options.weak: 是否生成弱的etag, 默认为false(即默认生成强的etag),但是如果entity为fs.Stats,那么生成弱的etag。

复制代码
// 只列出核心代码,一些对参数的校验啥的已略过
function etag (entity, options) {
 // 判断entity是否为fs.Stats类型
 var isStats = isstats(entity)
 var weak = options && typeof options.weak === 'boolean'
 ? options.weak
 : isStats

 // generate entity tag
 var tag = isStats
 ? stattag(entity)
 : entitytag(entity)

 return weak
 ? 'W/' + tag // 弱etag
 : tag
}

// 弱的etag是根据fs.Stats生成
function stattag (stat) {
 // 得到mtime时间戳的16进制
 var mtime = stat.mtime.getTime().toString(16)
 // 得到size的16进制
 var size = stat.size.toString(16)
 // 按照规范etag,应该用双引号包裹生成的字符串。
 return '"' + size + '-' + mtime + '"'
}
// 强tag,是将buffer或者字符串进行sha1,
// 在进行base64编码,在截取前27位
function entitytag (entity) {
 if (entity.length === 0) {
 // fast-path empty
 return '"0-2jmj7l5rSw0yVb/vlWAYkK/YBwk"'
 }

 // compute hash of entity
 var hash = crypto
 .createHash('sha1')
 .update(entity, 'utf8')
 .digest('base64')
 .substring(0, 27)

 // 获取字符串或者buffer的字节数
 var len = typeof entity === 'string'
 ? Buffer.byteLength(entity, 'utf8')
 : entity.length

 // " + 字节数的16进制 + 连接符 + hash + " => 强etag
 return '"' + len.toString(16) + '-' + hash + '"'
}

参考链接:

HTTP ETag

http-etag-if-none-match

相关推荐
I'mChloe4 小时前
飞牛NAS部署flatnotes实战:Docker、8080端口、Markdown笔记与固定地址访问
笔记·docker·容器
库玛西4 小时前
外部排序全解析:败者树、置换-选择排序与最佳归并树
c语言·数据结构·c++·笔记·考研·算法
摇滚侠4 小时前
《Java并发编程之美》第 2 章 并发编程的其他基础知识 阅读笔记 3
android·java·笔记
ss2735 小时前
AI时代首先数据库-PostgreSQL实战笔记 | 18 PostgreSQL基本索引原理与创建
数据库·笔记·postgresql
qq_284274057 小时前
电气控制笔记:常用低压电器符号原理与异步电动机点动、自锁、多地控制电路(含考点)
笔记·学习·自动化·制造
坤坤子吖7 小时前
Linux 线程同步与互斥——条件变量与线程同步
linux·开发语言·c++·笔记·学习
乐橙开放平台7 小时前
不用换摄像头,如何用乐橙把海康、大华、宇视统一到一个界面
笔记·物联网·自动化·音视频·智能家居
凯凯姜7 小时前
Vue 3 深入学习笔记 16:API 请求封装与统一错误处理
vue.js·笔记·学习
ACP广源盛139246256738 小时前
HDMI2.1 同源双屏方案选型,GSV6502@ACP 工程评估笔记
笔记·硬件架构·音视频·硬件工程·hdmi·国产芯片
wuyoutrans8 小时前
冰岛专利审查意见答复阶段,翻译文件多久可以交付,是否包含术语校对服务?
笔记