跳转到内容
搜索文档

重新验证

最后更新 查看 MarkdownAgent 设置

Stale-while-revalidate

当缓存资源过期时,Cloudflare 使用 Cache-Control 中的 stale-while-revalidate 指令来确定是否可以在从源站获取新副本的同时继续提供 stale 资源。如果指令存在且资源在允许的 staleness 窗口内,Cloudflare 向访客提供过期内容并在后台重新验证。通过使用 If-Modified-SinceETag 等标头,Cloudflare 验证内容而无需完全重新获取,减少源站流量。

异步重新验证

重新验证完全异步。当缓存资源过期且设置了 stale-while-revalidate 时,过期后到达的第一个请求在后台触发重新验证。该请求立即接收 stale 内容和 UPDATING 状态,而非阻塞等待源站响应。所有后续请求也接收 stale 内容和 UPDATING 状态,直到源站响应。重新验证完成后,后续请求接收 fresh 内容和 HIT 状态。

如果 stale 内容仍然有效,Cloudflare 设置新的 TTL。如果内容已更改,源站提供 fresh 内容替换旧内容。

控制 stale 行为

Cloudflare 仅在源站在其 Cache-Control 标头中包含 stale-while-revalidate 指令时,在重新验证期间提供 stale 内容。没有此指令,访客在接收内容之前等待源站响应。

如果源站设置了 stale-while-revalidate 但您想覆盖它,可以通过 Cache Rules 中的 Serve stale content while revalidating 设置禁用 stale 提供。

禁用 stale-while-revalidate 的指令

启用 Origin Cache Control 时,以下 Cache-Control 指令阻止 Cloudflare 提供 stale 内容,依据 RFC 9111 §4.2.4

  • must-revalidate — 禁止提供 stale 内容;缓存必须先与源站重新验证。
  • proxy-revalidate — 与 must-revalidate 相同,但仅适用于共享缓存(如 Cloudflare)。
  • s-maxage — 隐含 proxy-revalidate 语义,因此共享缓存不能提供 stale 内容。
  • no-cache — 在提供任何缓存响应之前需要重新验证。

如果任何这些指令与 stale-while-revalidate 同时存在,Cloudflare 不会提供 stale 内容——请求将返回 EXPIRED 而非 UPDATING

有关所有可用指令或禁用 Origin Cache Control 时的行为,请参阅 Cache-Control directives

面向用户的智能重新验证

当源站服务器响应中缺少 Last-ModifiedEtag 标头时,Smart Edge Revalidation 将对象在 Cloudflare 全球网络上缓存的时间用作 Last-Modified 标头值。当浏览器使用 If-Modified-SinceIf-None-Match 向 Cloudflare 发送重新验证请求时,我们的全球网络可以使用 Smart Edge Revalidation 生成的 Last-Modified 标头回答这些重新验证问题。这样,即使源站未发送这些标头,我们的全球网络也能确保高效重新验证。

这篇文档对您有帮助吗?