ETag 与 Last-Modified:省的不是请求数,是正文流量

两者都用于「问问源站有没有变」。搞清楚它们各自的精度和代价,能在不牺牲新鲜度的前提下砍掉大量回源字节。

6 分钟缓存与命中
ETag 与 Last-Modified:省的不是请求数,是正文流量

要点

验证请求省的是正文而不是往返:命中时返回 304,只有响应头没有正文。对大文件收益明显,对小文件几乎无意义。

本文目录
  1. 01验证是怎么发生的
  2. 02两者的差别
  3. 03实际能省多少

验证是怎么发生的

副本过期后,CDN 并不一定要重新下载整个资源。它可以带上上次记录的标识去问源站「还是这个吗」,源站若确认未变就返回 304 Not Modified——不含正文。

# CDN 发出的验证请求
If-None-Match: "a1b2c3d4"
If-Modified-Since: Wed, 15 Jul 2026 08:00:00 GMT

# 源站确认未变
HTTP/1.1 304 Not Modified

两者的差别

机制精度注意事项
Last-Modified秒级一秒内多次修改无法区分
ETag(强)字节级需要源站能稳定生成相同值
ETag(弱,W/ 前缀)语义级内容语义未变即视为相同

多源站部署时的坑

如果 ETag 由文件 inode 或时间戳生成,多台源站对同一份文件会给出不同的 ETag。CDN 每次验证都会拿到「变了」的结论,于是反复下载完整正文。多源站部署时要确保 ETag 基于内容哈希生成。

实际能省多少

验证请求仍然要走一次完整的回源往返,延迟省不掉。省下来的是正文字节——一个 5MB 的视频分片,验证命中时只传几百字节响应头。

  • 大文件(视频、安装包、字体):收益显著,回源流量能大幅下降;
  • 小文件(图标、小 JS):正文本来就小,省下的字节抵不上多一次往返的延迟——不如直接设长 TTL 加内容哈希文件名;
  • 真正的最优解是让资源根本不需要验证:内容哈希文件名 + 长 TTL + immutable。

在你的网站验证

边缘核验查看你的资源是否返回了可用的 ETag