You need to enable JavaScript to run this app.
导航
节点缓存规则
最近更新时间:2024.09.29 14:31:06首次发布时间:2022.02.09 10:16:58

本文档介绍火山引擎内容分发网络(CDN)中的缓存规则。

缓存规则概述

CDN 默认的缓存行为可以满足业务的基本需要。CDN 也允许您创建缓存规则来改变 CDN 的缓存行为。需要留意的是,创建缓存规则会极大影响 CDN 分发您站点文件的效率。在创建缓存规则前,请务必仔细阅读本文档。

缓存规则的作用如下:

  • 对于 CDN 收到的用户请求,匹配的缓存规则指定了 CDN 是否先尝试从缓存中获取请求文件。

  • 对于 CDN 从源站收到的请求文件,缓存规则指定了 CDN 是否要缓存文件。

  • 如果请求文件需要被 CDN 缓存,缓存规则指定了 CDN 缓存该文件的时长。

说明

对于 CDN 收到的用户请求,如果匹配的缓存规则中的缓存时间是 0,则 CDN 会向源站请求文件。

工作原理

收到用户请求时

当收到一个用户请求时,匹配该请求的缓存规则指定了 CDN 执行以下某个操作:

  • 向源站请求该文件。参见 配置说明 中 "过期时间" 的说明。

  • 尝试从缓存中获取请求文件。

    • 如果缓存中有该文件并且文件还未过期,CDN 将缓存获取中的文件发送给用户。

    • 如果缓存中有该文件但是文件已过期,CDN 进行 回源校验

    • 如果缓存中没有该文件,CDN 向源站请求该文件。

收到来自源站的请求文件时

当收到来自源站的请求文件时,是同一条缓存规则对请求文件生效。该规则指定了 CDN 执行以下某个操作:

  • 假设之前该缓存规则指定 CDN 向源站请求该文件。在这个情况下,CDN 不会缓存请求文件。

  • 假设之前该缓存规则指定 CDN 应尝试从缓存中获取请求文件。在这个情况下,CDN 会根据缓存规则的配置执行相应的缓存行为。参见下表。

    缓存策略补充配置缓存行为缓存时间
    CDN 缓存强制缓存(开)忽略源站响应头指示的不缓存,始终缓存文件。遵循规则中配置的 过期时间
    强制缓存(关)不忽略源站响应头指示的不缓存。但如果未指定缓存行为时,不缓存文件。
    遵循源站补充缓存(开)遵循源站响应头的配置。未指示缓存行为时,缓存文件。遵循响应头指定的缓存时长。未配置缓存行为时,遵循规则中配置的 过期时间
    补充缓存(关)遵循源站响应头的配置。未指示缓存行为时,不缓存文件。遵循响应头指定的缓存时长。

    关于缓存行为的详细描述,参见 缓存行为的详细描述

默认缓存规则

在缓存规则列表中,有一条默认的缓存规则。该规则的作用是匹配那些无法满足其他缓存规则中过滤条件的用户请求,确保任何请求都能匹配到一条缓存规则。

该规则的优先级最低。您无法修改该规则或者删除该规则,您也无法调整该规则的优先级。

创建缓存规则

  1. 登录 火山引擎内容分发网络控制台

  2. 在左侧导航栏,点击 域名管理

  3. 域名管理 页面,找到需要配置的域名,点击 管理

  4. 在域名页面上,点击 缓存配置 页签。

  5. 在页面右上方,点击 编辑配置

  6. 节点缓存规则 下方,点击 新增规则。您最多可以添加 50 条规则。

  7. 根据 配置说明 进行设置。

  8. 配置完成后,在页面右上方,点击 提交编辑

配置说明

配置说明

规则类型

表示规则中的过滤条件。该配置有以下选项:

  • 文件后缀:表示路径末尾的扩展名。

  • 文件目录:表示路径中的目录。

  • 文件全路径:表示请求 URL 中的路径。

  • 全路径正则表达式:表示请求 URL 中的路径,通过正则表达式匹配。 要指定该选项,请 提交工单

规则内容

表示规则中的过滤值。多个过滤值之间使用分号(;)分隔,总长度不能超过 1,024 个字符,不能包含以下字符:

  • 连续斜杠(//)、空格、美元符号($)、问号(?)、Delete(ASCII code 127)。

CDN 在尝试将规则中的过滤条件与用户请求匹配时,匹配过程是大小写不敏感的。

另外,

  • 如果 规则类型文件后缀,过滤值是一个或者多个文件后缀。文件后缀无需以句点(.)开头。例如:png;txt

  • 如果 规则类型目录,过滤值是一个或者多个目录路径。目录路径必须以斜杠(/)开头和结尾。例如:/chs/foods/;/us/birds/

  • 如果 规则类型文件全路径,过滤值是一个或者多个文件路径。文件路径必须以斜杠(/)开头,可以包含星号(*)用来表示一个或者多个字符。例如:/chs/foods/local*sets;/us/birds/chickadee

  • 如果 规则类型全路径正则表达式,过滤值是一个或者多个正则表达式,用于匹配请求路径中的任意字符串。例如:^/a{1,2}.*g$

忽略大小写匹配

表示规则内容是否是大小写敏感的。 该配置的默认设置是 关闭,表示是大小写敏感的。 例如:规则类型文件后缀,规则内容是 png;txt忽略大小写关闭。此时,该规则可以匹配 URL 是 HTTPS://www.EXAMPLE.com/image.png 的请求,但是无法匹配 URL 是 https://www.example.com/image.PNG 的请求。

缓存策略参见 缓存行为的详细描述

缓存时间

表示请求文件的缓存时长。 如果您输入 0,表示 CDN 不缓存请求文件。同时,对于匹配该规则的请求,CDN 也不会尝试从缓存中获取请求文件。

说明

对于过期时间为 0 的缓存规则,建议您设置这些规则的优先级高于其他规则。

规则生效逻辑

在规则列表中,每条规则都有一个优先级,优先级为 1 的规则优先级最高。当收到一个用户请求时,CDN 会按照优先级从高到低的顺序使用规则对该请求进行过滤。如果请求满足某条规则中的条件,则该规则中的配置对请求生效,并且 CDN 停止使用其余规则对用户请求进行过滤。您可以拖动规则来调整优先级。

规则中的过滤条件定义了规则的作用范围。如果您创建了多条规则,请注意这些规则的作用范围是否重叠,并且按照您的期望设置规则的优先级。例如,您创建了两条规则,规则A 的作用范围是 /dir/,规则B 的作用范围是 png;jpg。如果 /dir/ 目录中有. png 文件,并且您希望规则B 的配置优先对 .png 文件的请求生效,则需要将规则B 的优先级设置为高于规则A。

缓存行为的详细描述

缓存策略策略配置缓存行为缓存时间
遵循规则强制缓存(开)表示 CDN 始终缓存请求文件。遵循 缓存时间 配置。

强制缓存(关)

  • 在以下情况下,CDN 不会缓存请求文件。

    • 源站响应包含 Cache-Control: no-storeCache-Control: private头部。
    • 源站响应既不包含 Cache-Control,也不包含 Expires 头部。
  • 在其他情况下,CDN 缓存请求文件。

遵循源站

补充缓存(开)

  • 在以下任意情况下,CDN 缓存请求文件。

    • 源站响应包含 Cache-Control: max-ageExpires 头部。

    • 源站响应既不包含 Cache-Control,也不包含 Expires 头部。

  • 如果源站响应包含 Cache-Control: no-cacheCache-Control: no-store 时,CDN 不会缓存请求文件。

  • 如果源站响应包含 Cache-Control: max-ageExpires 头部,CDN 遵循响应头指定的缓存时长。

  • 如果源站响应不包含 Cache-ControlExpires 头部,CDN 遵循 缓存时间 配置。

补充缓存(关)

  • 在以下情况下,CDN 缓存请求文件。

    • 源站响应包含 Cache-Control: max-ageExpires 头部。
  • 在以下情况下,CDN 不会缓存文件:

    • 源站响应包含 Cache-Control: no-cacheCache-Control: no-store
    • 源站响应既不包含 Cache-Control,也不包含 Expire 头部。

遵循响应头指定的缓存时长。

更多信息

文件分片的缓存过期时间

假设 CDN 收到了一个 Range 请求,请求的是文件X 的一个分片A。在缓存分片A 时,CDN 使用以下步骤计算分片A 的缓存过期时间:

  • 在文件X 被 CDN 缓存的所有分片(包括完整文件)中,获取缓存时间最早的那个分片。假设该分片是分片B。
    • 如果分片B 存在并且还未过期,分片A 的缓存过期时间 = 分片B 的缓存过期时间。

    • 如果分片B 不存在或者已过期,分片A 的缓存过期时间 = 当前时间 + 缓存 TTL。

示例
对于您站点上的一个文件,CDN 在某一天的不同时间点收到了以下请求:

  • 9:00:CDN 收到了分片A 的请求。

  • 10:00:CDN 收到了分片B 的请求。

  • 11:00:CDN 收到了完整文件的请求。

假设该文件的缓存 TTL 是 4 小时。在缓存中,该完整文件和两个分片的过期时间都是 13:00。

文件不缓存的情况

在以下情况下,CDN 会忽略所有缓存规则,始终不缓存请求文件:

  • 源站响应中 Content-Length 头的值为 0

  • 用户请求所使用的方法既不是 GET 也不是 HEAD。

  • 源站的响应状态码不是 2xx,并且您未配置 状态码缓存

  • 对于 HEAD 请求,源站响应中包含 Transfer-Encoding:chunked 头部。

在以下情况下,CDN 默认不缓存请求文件。然而,您可以使用缓存规则覆盖 CDN 的默认缓存行为。

  • 源站响应包含 Cache-Control: max-age = 0 头部或者包含的 Expires 头部所指定的时间早于 CDN 收到请求的时间。

源站响应头包含 no-cache 时

为了满足大部分用户的需求,对于源站响应头包含 Cache-Control: no-cache 的请求文件,CDN 调整了默认缓存行为。

如果您的加速域名收到了这类文件的请求,CDN 的默认缓存行为如下:

  • 如果该加速域名是在 2024年3月15日之前(不包含 3月15日)创建,CDN 默认缓存请求文件。但是该缓存文件会立刻被标记为已过期。对于之后收到该文件的请求,CDN 会进行 回源校验

  • 如果您的加速域名的创建日期晚于 2024年3月15日(包含 3月15日),CDN 默认不会缓存请求文件。

然而,您可以使用缓存规则覆盖 CDN 的默认缓存行为。

如何判断缓存的文件过期

如果一个请求命中了缓存,CDN 遵循以下步骤判断缓存的文件是否已过期:

  1. 计算该文件已缓存的时长,精确到秒。计算公式是:文件已缓存时长 = 该请求到达 CDN 的时间 - 该文件被缓存的时间

  2. 从匹配该请求的缓存规则中获取该文件的缓存过期时间。

如果 文件已缓存时长 > 该文件的缓存过期时间,表示缓存的文件已过期。如果 已缓存时长 <= 该文件的缓存过期时间,表示缓存的文件未过期。

强制缓存更新

假设 CDN 的缓存中的某个文件还未过期,但是在源站上该文件已经被更新了。您需要用户获取该文件的最新版本。

在这个情况下,您可以在 CDN 里对该文件进行 刷新 操作。刷新操作强制将该文件标记为已过期。之后,如果用户请求该文件,CDN 会进行 回源校验。获取到更新文件后,CDN 将更新的文件发送给用户并缓存该更新文件。

回源校验

当一个缓存文件过期后,如果收到了该文件的请求,CDN 会向源站校验该文件是否在源站上有更新。回源校验的逻辑如下:

  • 如果源站响应包含 ETag,无论 Last-Modified 是否存在,回源校验请求中会包含 If-None-Match 头部。该头部的值就是 ETag 的值。

  • 如果 ETag 不存在但是 Last-Modified 存在,回源校验请求中会包含 If-Modified-Since 头部。该头部的值就是 Last-Modified 的值。

说明

如果该文件的源站响应既没有包含 Last-Modified,也没有包含 ETag 头部,CDN 不做回源校验,而是向源站请求该文件。

基于源站对回源校验请求的响应状态码,CDN 执行以下某个操作:

  • 如果状态码是 304,表示该文件在源站没有更新。在这个情况下,CDN 将缓存中的文件响应用户请求。如果之后 CDN 收到了该文件的请求,CDN 会再次对该文件执行回源校验。

  • 如果状态码是 200,表示该文件在源站有更新并且响应正文中包含了最新的文件。在这个情况下,CDN 将更新的文件发送给用户并缓存更新的文件。