协商缓存中Etag与If-None-Match是怎么利用文件内容哈希值(Hash)解决秒级内修改无法识别问题的

冷漠man

冷漠man

2026-07-27

187人浏览

原创

last-modified在秒内多次修改时失效,因其时间精度仅到秒级,同一秒内修改不更新时间戳,浏览器比对if-modified-since后误判未变而返回304;etag基于内容哈希(如md5),字符级变更即触发新标识,天然支持毫秒级识别,配合cache-control可实现分钟级生效。

协商缓存中etag与if-none-match是怎么利用文件内容哈希值(hash)解决秒级内修改无法识别问题的

ETag 和 If-None-Match 通过内容哈希值实现秒级甚至毫秒级变更识别,核心在于“内容决定标识”,而非依赖时间戳这类粗粒度字段。

为什么 Last-Modified 在秒内多次修改时会失效

Last-Modified 精度仅到秒——同一秒内无论文件改多少次,时间戳不变;浏览器发 If-Modified-Since 时也只带秒级时间,服务器比对后认为“没变”,直接返回 304,导致用户看到过期内容。这在热更新、CI/CD 自动部署或高频配置变更场景中很常见。

而 ETag 若基于内容哈希(如 xxHash、MD5 或 SHA-256),哪怕一个字符变动,哈希值就完全不同,天然规避了时间精度缺陷。

Memories.ai
Memories.ai

专注于视频解析的AI视觉记忆模型

下载

内容哈希如何生成并确保一致性

  • 构建阶段预计算:打包工具(如 Webpack/Vite)在生成 JS/CSS/图片时,对文件内容做哈希,把哈希值嵌入文件名(如 app.a1b2c3d4.js)或写入响应头 ETag: "a1b2c3d4"
  • 运行时动态计算:Nginx 配合 ngx_http_fingerprint_module 对响应体实时哈希;Apache 则需后端(如 Node.js/Java)在返回前计算并设 ETag 响应头
  • 关键原则:禁用默认 ETag(如 Nginx 的 etag off;,Apache 的 FileETag None),避免 inode/mtime 等不稳定因子干扰

协商过程如何体现“秒级识别”

浏览器缓存资源后,下次请求自动带上 If-None-Match: "old-hash"。服务端拿到该值,立即对当前资源内容重新哈希,得到 "new-hash"

  • "new-hash" === "old-hash" → 内容未变 → 返回 304,不传 body
  • "new-hash" !== "old-hash" → 即使距上次修改不到 1 秒 → 返回 200 + 新内容

整个过程不依赖系统时钟同步、不等待下一秒,只要内容有异,下一次协商请求就能立刻感知。

配合 Cache-Control 才能真正落地“分钟级校验”

ETag 本身不触发请求,只是验证机制。要让浏览器频繁发起协商,得靠缓存策略驱动:

  • Cache-Control: public, max-age=60, must-revalidate,强制每分钟过期一次
  • 过期后浏览器自动带 If-None-Match 发起协商,而不是直接复用缓存
  • 这样,即使资源在第 59 秒更新,第 60 秒的请求就能命中新内容,实现“分钟级生效”

相关专题

更多
if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

2023.08.22

1020

3

墨刀AI提示词教学
墨刀AI提示词教学

本合集由PHP中文网精心整理,为您提供全面的墨刀AI提示词教学。内容涵盖高质量原型撰写公式与实操窍门,助您轻松掌握AI设计工具。无论是零基础入门还是进阶技巧,都能让您快速上手,大幅提升产品设计与协作效率。

2026.08.04

8

21

墨刀AI完整入门
墨刀AI完整入门

PHP中文网为您倾力打造墨刀AI保姆级入门指南完整版!本合集从零基础讲起,涵盖AI生成原型、提示词优化、图片转原型及多轮对话等核心功能。无论您是新手还是进阶用户,都能轻松掌握产品设计全流程。快来PHP中文网,一键解锁高效设计技巧,让想法即刻成型!

2026.08.04

3

20

墨刀AI进阶技巧
墨刀AI进阶技巧

本合集由PHP中文网精心整理,为您提供墨刀AI核心进阶策略指南。内容涵盖高效提示词写作、原型智能生成与微调、结构化导图制作及行业分析报告输出等实战技巧。助您轻松掌握AI设计工具,大幅提升产品设计与团队协作效率。

2026.08.04

7

14

火山引擎实名认证失败怎么办
火山引擎实名认证失败怎么办

火山引擎实名认证失败可能与证件信息填写错误、姓名或企业信息不一致、证件照片不清晰、营业执照状态异常、手机号验证失败或审核资料不完整有关。本专题整理个人认证、企业认证、资料上传、审核退回、重新提交和认证不通过的常见处理方法。

2026.08.04

4

10

火山引擎域名备案流程详解
火山引擎域名备案流程详解

火山引擎域名备案适合需要在火山引擎云服务器、对象存储、CDN或网站服务上绑定域名的用户参考。本专题整理备案入口、账号实名认证、备案类型选择、主体信息填写、网站信息提交、资料上传、初审核验、管局审核和备案失败排查,帮助用户完成网站上线前的备案流程。

2026.08.04

0

10

火山引擎DNS解析配置步骤
火山引擎DNS解析配置步骤

使用火山引擎DNS解析网站域名时,需要确认域名已完成管理接入,并正确配置服务器IP、CNAME地址或验证记录。本专题整理域名添加、记录类型选择、TTL设置、解析状态检查、备案和访问测试等流程,适合新手搭建网站时参考。

2026.08.04

2

10

火山引擎对象存储使用教程
火山引擎对象存储使用教程

火山引擎对象存储适合用于网站图片、视频文件、备份数据、静态资源和应用附件管理。本专题整理TOS控制台入口、存储桶创建、地域选择、权限设置、文件上传、访问链接生成、CDN加速、费用查看和常见上传或访问失败问题,帮助用户快速掌握对象存储基础操作。

2026.08.04

1

10

火山引擎云服务器使用教程
火山引擎云服务器使用教程

火山引擎云服务器使用教程适合第一次购买、部署和管理云服务器的用户参考。本专题整理控制台入口、实例创建、地域和配置选择、系统镜像设置、安全组放行、远程连接、网站部署、续费计费和常见连接失败问题,帮助用户快速完成云服务器基础使用流程。

2026.08.04

5

10

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
php-src源码分析探索
php-src源码分析探索

共6课时 | 0.6万人学习

Golang云原生架构师课程
Golang云原生架构师课程

共49课时 | 4.2万人学习

Golang基础入门到精通(第二季)
Golang基础入门到精通(第二季)

共49课时 | 4万人学习