ETag 标头标识浏览器缓存中的资源版本是否与源站 Web 服务器上的资源相同。访问者的浏览器存储 ETag。当访问者再次访问站点时,浏览器将每个 ETag 与其存储的 ETag 进行比较。匹配的值导致 304 Not-Modified HTTP 响应,表示缓存资源版本是最新的。Cloudflare 支持在源站 Web 服务器上配置的强 ETag 和弱 ETag。
弱 ETag 标头表示缓存的资源在语义上等同于 Web 服务器上的版本,但不一定逐字节相同。
强 ETag 标头确保浏览器缓存和 Web 服务器中的资源逐字节相同。使用 Cache Rules 来启用强 ETag 标头。
在缓存规则中启用 Respect Strong ETags(遵循强 ETag) 时,Cloudflare 将使用强 ETag 标头验证,确保 Cloudflare 缓存和源站服务器中的资源逐字节相同。
但是,在某些情况下,Cloudflare 会将强 ETag 转换为弱 ETag。例如,在以下条件下:
- 已启用 Respect Strong ETags(遵循强 ETag)
- 已启用 Brotli 压缩
- 源站服务器的响应包含
etag: "foobar"强 ETag 标头
Cloudflare 网络将根据访客的 accept-encoding 标头和源站服务器响应中使用的压缩方式采取以下操作:
访客发送的 accept-encoding标头 |
源站服务器响应中使用的压缩 | Cloudflare 操作 |
|---|---|---|
gzip, br |
GZIP | 向访客返回 GZIP 压缩的响应,带强 ETag 标头:etag: "foobar"。 |
gzip, br |
Brotli | 向访客返回 Brotli 压缩的响应,带强 ETag 标头:etag: "foobar"。 |
br |
GZIP | 解压 GZIP 并向访客返回未压缩响应,带弱 ETag 标头:etag: W/"foobar"。 |
gzip |
Brotli | 解压 Brotli 并向访客返回未压缩响应,带弱 ETag 标头:etag: W/"foobar"。 |
gzip |
(无) | 向访客返回未压缩响应,带强 ETag 标头:etag: "foobar"。 |
gzip, br, zstd |
Zstandard | 向访客返回 zstd 压缩响应,带强 ETag 标头:etag: "foobar"。 |
gzip, br |
Zstandard | 解压 zstd 并向访客返回 br 响应,带弱 ETag 标头:etag: W/"foobar"。 |
zstd |
Brotli/GZIP | 解压 zstd 并向访客返回 zstd 响应,带弱 ETag 标头:etag: W/"foobar"。 |
在 Cloudflare 中启用 Respect Strong ETags(遵循强 ETag) 将自动禁用 Rocket Loader、电子邮件混淆和自动 HTTPS 重写。
禁用 Respect Strong ETags(遵循强 ETag) 时,如果以下所有条件均满足,Cloudflare 将保留源站 Web 服务器设置的强 ETag 标头:
- 源站服务器发送使用 GZIP 或 Brotli 压缩的响应,或未压缩的响应。
- 如果源站服务器发送压缩响应,访客根据
accept-encoding标头接受相同的压缩方式(GZIP、Brotli)。 - 已禁用 Rocket Loader 和电子邮件混淆功能。
在所有其他情况下,Cloudflare 将把强 ETag 标头转换为弱 ETag 标头或删除强 ETag。例如,在以下条件下:
- 已禁用 Respect Strong ETags(遵循强 ETag)
- 已启用 Brotli 压缩
- 源站服务器的响应包含
etag: "foobar"强 ETag 标头
Cloudflare 网络将根据访客的 accept-encoding 标头和源站服务器响应中使用的压缩方式采取以下操作:
访客发送的 accept-encoding标头 |
源站服务器响应中使用的压缩 | Cloudflare 操作 |
|---|---|---|
gzip, br |
GZIP | 解压 GZIP 并向访客返回 Brotli 压缩响应(因为已启用 Brotli 压缩),带弱 ETag 标头:etag: W/"foobar"。 |
gzip, br |
Brotli | 向访客返回 Brotli 压缩响应,带强 ETag 标头:etag: "foobar"。 |
br |
GZIP | 解压 GZIP 并向访客返回 Brotli 压缩响应,带弱 ETag 标头:etag: W/"foobar"。 |
gzip |
Brotli | 解压 Brotli 并向访客返回 GZIP 压缩响应,带弱 ETag 标头:etag: W/"foobar"。 |
gzip |
(无) | 使用 GZIP 压缩源站响应并返回给访客,带弱 ETag 标头:etag: W/"foobar"。 |
gzip, br, zstd |
Zstandard | 向访客返回 zstd 压缩响应,带强 ETag 标头:etag: "foobar"。 |
gzip, br |
Zstandard | 解压 zstd 并向访客返回未压缩响应,带弱 ETag 标头:etag: W/"foobar"。 |
zstd |
Brotli | 解压 zstd 并向访客返回未压缩响应,带弱 ETag 标头:etag: W/"foobar"。 |
有关更多信息,请参阅内容压缩。
-
强 ETag 标头中的值必须使用双引号(例如
etag: "foobar")。如果格式不正确,Cloudflare 将删除 ETag 标头,而不是将其转换为弱 ETag。 -
如果资源可缓存且发生缓存未命中,Cloudflare 不会向源站服务器发送 ETag 标头。这是因为 Cloudflare 需要完整的响应正文来填充其缓存。
-
如果您的源站(或 R2)根据
accept-encoding应用压缩,第一种压缩类型将被缓存。请考虑强 ETag 是否适合您的使用场景,或使用缓存键规则来处理不同的压缩类型。