HTTP 强 Etag 和 弱 Etag

server/2025/3/12 9:31:51/

强校验和弱校验

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 tagvar 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 emptyreturn '"0-2jmj7l5rSw0yVb/vlWAYkK/YBwk"'}// compute hash of entityvar 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 + " => 强etagreturn '"' + len.toString(16) + '-' + hash + '"'
}

参考链接:

HTTP ETag
http-etag-if-none-match


http://www.ppmy.cn/server/174414.html

相关文章

[Unity3D] 动态立方体贴图系统

动态立方体贴图系统 介绍 1、准备 2、实现 3、原理 4、另请参阅 动态立方体贴图系统 当今,反射是可以让一个 Shader 在感官上具备视觉冲击力的一项关键技术,它是在 Shader 表面上模拟环境反射的一个过程,在这个过程中使用了你周围的世界…

React 性能优化

从 React 层面上,可以进行以下性能优化: 1.使用 memoization(记忆化):通过使用 React.memo()或useMemo()来避免不必要的重新渲染。这对于纯函数组件和大型组件特别有用。 2.使用 shouldComponentUpdate 或PureComponent:在类组件中,可以通过重写shouldCo…

使用pytest-xdist让自动化并行测试变得轻松简单

关注开源优测不迷路 大数据测试过程、策略及挑战 测试框架原理,构建成功的基石 在自动化测试工作之前,你应该知道的10条建议 在自动化测试中,重要的不是工具 在实际的项目中即便没有数千个测试,也有 100 个测试。当你运行 pytest …

Go语言单元测试和基准测试

单元测试和基准测试 在Go语言中,单元测试和基准测试是两种不同类型的测试,它们的目的、使用场景以及实现方式都有所不同。以下是它们的主要区别: 1. 目的 单元测试: 目的是验证代码单元(通常是函数或方法&#xff09…

卡顿优化(matrix与blockcanary)

卡顿优化(matrix与blockcanary) 在Android应用开发中,流畅的用户体验是产品成功的关键因素之一。然而,随着应用功能的不断丰富,卡顿问题也随之而来。本文将深入探讨Android应用中的卡顿问题,包括卡顿的原因、检测方法以及优化策略,并重点介绍两款强大的卡顿检测工具:M…

SQL语句执行顺序是什么?

理解SQL语句的执行顺序对于优化查询和提高数据库性能非常重要。 1. SQL语句的执行过程 当我们执行一条SQL语句时,MySQL会按照一定的顺序解析和执行这条语句。这个过程可以分为以下几个阶段: 1.1 解析SQL语句 MySQL首先会解析SQL语句,将其分…

Flutter 学习之旅 之 flutter 不使用插件,实现简单带加载动画的 LoadingToast 功能

Flutter 学习之旅 之 flutter 不使用插件,实现简单带加载动画的 LoadingToast 功能 目录 Flutter 学习之旅 之 flutter 不使用插件,实现简单带加载动画的 LoadingToast 功能 一、简单介绍 二、LoadingToast 三、简单案例实现 四、关键代码 一、简单…

Spring Boot 与 Spring MVC 有何不同

Spring Boot 和 Spring MVC 都是 Spring 框架的一部分,但它们有不同的目标和功能。以下是它们之间的主要区别: 1. 核心目标 Spring Boot:Spring Boot 的目标是简化 Spring 应用的配置和部署。它通过提供默认配置和嵌入式服务器(如 Tomcat、Je…