源站 Origin Cache-Control

本文档介绍了在通过 Page Rule 启用“Origin Cache Control”功能时,Cloudflare 如何解析客户源站的 Cache-Control 标头。

Cache-Control 标头是系统管理员用于告知 Cloudflare 如何处理您的源站内容的一种方式。

可缓存性

Cloudflare 如何做出缓存决策分为两部分:请求阶段和响应阶段。

请求阶段

在请求阶段,客户端请求的 URL 与可缓存扩展的列表进行匹配。如果请求与此列表中的扩展匹配,我们将检查并提供(如果存在)内容的缓存。如果缓存存在但已过期,则在向客户端提供响应之前,将尝试使用源站重新验证内容。

可以通过 Cloudflare 控制面板中 Cache 应用的“Cache Level”设置来修改 Cloudflare 认为可缓存的内容。例如,“Cache Everything”会导致跳过扩展检查,并且所有内容都将视为可缓存。也可以通过 Page Rule 调整这些设置。

响应阶段

如果 Cloudflare 认为请求可缓存,则我们会先在多个地区检查缓存的内容。如果资源不在缓存中,Cloudflare 将向源站发出请求以缓存资源。

收到的响应将发送给发起请求的客户端。

此时,我们的缓存逻辑将检查从源站接收的 HTTP 响应。

根据对请求中标头的分析判断,响应将被视为可缓存并写入磁盘(用于这个资源的下一个请求),或者视为不可缓存(从而导致下一个请求没有击中缓存并重复此流程)。

Cache-Control 指令

Cache-Control 标头可以包含许多指令。如果多个指令一起传递,则用逗号分隔每个指令。如果指令采用参数,则将遵循由等号分隔的指令。

从广义上讲,指令按照可缓存性(此对象是否应进入缓存?)、过期时间(它应在缓存中保留多长时间?)、重新验证(当对象“过期”时,缓存应如何表现?)和其他几个控制如何处理资源缓存的因素可分解为多个存储。 

可缓存性

  • public
    “public”响应指令表示任何缓存都可以存储响应,即使响应通常是不可缓存的或只能在私有缓存中缓存亦如此。
  • private
    “private”响应指令表示响应消息旨在用于单个用户(例如,浏览器缓存),并且不得由共享缓存(如 Cloudflare 或其他公司代理)存储。
  • no-store
    “no-store”响应指令表示任何缓存(即客户端或代理缓存)都不能存储即时请求或响应的任何部分。

过期时间

除了设置以下参数外,还要确保在源 Web 服务器中设置 HTTP Expires 标头,以使用 RFC 2616 中规定的格林威治标准时间 (GMT) 格式。
  • max-age=<seconds>
    “max-age”响应指令表示在其时间超过指定的秒数后,响应将被视为过时。age 定义为自源站提供资源以来的时间(秒)。seconds 参数是不带引号的整数。
  • s-maxage=<seconds>
    “s-maxage”响应指令表示在共享缓存中,此指令指定的最长使用期限将覆盖 max-age 指令或 Expires 标头字段指定的最长使用期限。 s-maxage 指令还暗示了 proxy-revalidate 响应指令的语义。
  • no-cache
    “no-cache”响应指令表示,如果没有在源站上验证成功,则不得使用此响应回应后续请求。这允许源站防止缓存在没有与源站验证的情况下,使用该响应来回应请求,即使是已经配置为发送过期响应的缓存也是如此。

重新验证

  • must-revalidate
    “must-revalidate”响应指令表示,一旦它过期,如果没有在源站上验证成功,则缓存(客户端或代理)便不能使用此响应来回应后续请求。
  • proxy-revalidate
    “proxy-revalidate”响应指令与 must-revalidate 响应指令具有相同的含义,但它不适用于客户端私有缓存。
  • stale-while-revalidate=<seconds>
    当存在于 HTTP 响应中时,stale-while-revalidate Cache-Control 指令表示缓存可以用于响应在其过期之后出现的请求,直到对象过期后规定的秒数。 注意:如果已启用 Always Online,则将忽略 stale-while-revalidate 指令。
  • stale-if-error=<seconds>
    stale-if-error Cache-Control 指令表示当遇到错误时,可以使用过期的缓存来响应请求,而不管其他更新信息如何。 注意:如果已启用 Always Online,则将忽略 stale-if-error directive 指令。

其他

  • no-transform
    “no-transform”响应指令表示中介(无论是否实有提供缓存)不得转换资源内容
  • immutable
    向客户端指示响应正文不会随时间变化。资源(如果未过期)在服务器上没有更新,因此客户端不会为其发送请求重新验证(例如,If-None-Match 或 If-Modified-Since)以检查是否更新,即使用户明确刷新页面也是如此。该指令对 Cloudflare 等公共缓存没有影响,但会更改浏览器行为。
     

示例

缓存静态资源

Cache-Control: public, max-age=86400

确保私有资源永远不会被缓存

Cache-Control: no-store

允许在浏览器上缓存资源,但在代理缓存上不缓存资源

Cache-Control: private, max-age=3600

允许在客户端和代理缓存中缓存资产,但在每次响应该资源请求时,都首先回源进行重新验证

Cache-Control: public, no-cache

允许在代理高速缓存中缓存资源,但每次响应资源请求时都要求代理重新回源验证

Cache-Control: public, no-cache, proxy-revalidate

或者

Cache-Control: public, s-maxage=0

允许在代理缓存资源,但在每次响应该资源时,任何缓存都需要重新验证

Cache-Control: public, no-cache, must-revalidate

允许缓存资源,但请确保代理不会对其进行修改

Cache-Control: public, no-transform

请注意,如果源站提供的资源内容未经压缩,则还会禁用从我们的节点到客户端的压缩功能,如 gzip 或 brotli 压缩。

允许缓存资源,首选重新验证,但如果源站无法访问或服务错误,则允许提供过期响应

Cache-Control: public, max-age=3600, stale-if-error=60

在高速缓存中保存内容 3600 秒(1 小时)后,Cloudflare 将尝试连接源站重新验证内容。如果服务器返回错误而不是正确的重新验证响应,Cloudflare 将在资源过期后继续为客户端提供此资源的响应 1 分钟。

在 Cloudflare 和访问者的浏览器中将资源缓存不同的时间

Cache-Control: public, max-age=7200, s-maxage=3600

缓存资源并在重新验证时响应此资源

Cache-Control: max-age=600, stale-while-revalidate=30

表示它在 600 秒内是新的和有效的缓存,并且在尝试初始同步验证时,它可能会在最多 30 秒内继续为相同资源的并发请求提供过期的缓存。

与其他 Cloudflare 功能的交互

Edge Cache TTL

Edge Cache TTL Page Rule 设置将覆盖 s-maxage 并禁用重新验证指令(如果存在)。即使存在 Edge Cache TTL 覆盖,源站的 Cache-Control 标头也会从我们的节点向下游传递。

Browser Cache TTL

Browser Cache TTL Page Rule 设置将覆盖从我们的节点向下游传递的 max-age 设置,通常是传递到访问者的浏览器。

Polish

当存在 no-transform 指令时,将禁用 Polish。

Gzip 和其他压缩

当存在 no-transform 指令时,将禁用压缩。如果从源站获取的资源经过压缩,则会向访问者提供压缩的资源。如果原始资产未经压缩,则不会应用压缩。

Not finding what you need?

95% of questions can be answered using the search tool. This is the quickest way to get a response.

由 Zendesk 提供技术支持