本文档介绍火山引擎内容分发网络(CDN)中的缓存规则。
缓存规则概述
缓存规则决定了 CDN 如何缓存从源站获取的文件。默认情况下,CDN 遵循源站响应头中对于缓存的指示来缓存收到的文件,参见 默认缓存规则。源站响应头指示 CDN 是否需要缓存收到的文件,以及缓存的时长。
如果您需要修改 CDN 对特定请求的缓存行为,可以在 CDN 中创建缓存规则。例如,您可以创建缓存规则,指定 CDN 始终对满足以下条件的请求缓存请求文件,缓存时长为 3 天:
- 请求 URL 中的目录路径为
/img/loca-food/。 - 文件名以
Chinese 开头。 - 文件后缀为
.png。
说明
- 随请求文件一起被缓存的还有源站响应中的响应状态码和响应头。也就是说,CDN 缓存的是完整的源站响应。在 CDN 响应用户请求时,除了请求文件,源站响应状态码和响应头也包含在 CDN 对用户请求的响应中。
- 缓存文件时,CDN 将源站响应中
Date 头部的值记录为该文件的缓存时间点。 - 当 CDN 收到一个用户请求,如果请求的文件在 CDN 的缓存中并且 CDN 判断缓存的文件未过期,该请求被认为是缓存命中。
- 如果文件的缓存时长为
0,则 CDN 不缓存文件。
缓存行为
在缓存规则中,各策略配置对缓存行为的影响如下表所示:
缓存策略 | 策略配置 | 缓存行为 |
|---|
遵循规则 | 强制缓存(开) | 始终缓存文件,并遵循规则中的缓存时长。 |
强制缓存(关) | - 如果源站响应头包含 Cache-Control: no-store/private/no-cache 或者未包含 Cache-Control 和 Expires,则不缓存文件。
- 其余情况下,遵循规则中的缓存时长缓存文件。
|
遵循源站 | 补充缓存(开) | - 遵循源站响应头中的 Cache-Control 或 Expires。
- 如果无 Cache-Control 和 Expires,则遵循规则中的缓存时长缓存文件。
|
补充缓存(关) | - 遵循源站响应头中的 Cache-Control 或 Expires。
- 如果无 Cache-Control 和 Expires,则不缓存文件。
|
创建缓存规则
- 登录 火山引擎内容分发网络控制台。
- 在左侧导航栏,点击 域名管理。
- 在 域名管理 页面,找到需要配置的域名,点击 管理。
- 定位 节点缓存规则 模块。
- 如果您使用的是旧版域名管理页面,点击 编辑配置,然后在 缓存配置 标签页中定位 节点缓存规则 模块。
- 如果您使用的是新版域名管理页面,点击 编辑域名。在页面左侧的树状配置项列表中,定位 功能配置 > 缓存配置 > 节点缓存规则。
关于新旧版域名管理页面的区别,参见 新版域名配置。
- 在 节点缓存规则 模块中,点击 新增规则。您最多可以添加 50 条规则。

- 根据 配置说明 进行设置。
- 配置完成后,点击 提交编辑。

配置说明
配置 | 说明 |
|---|
规则类型 | 表示规则中的匹配条件。该配置有以下选项: - 文件后缀:表示 URL 路径末尾的扩展名。
- 文件目录:表示 URL 路径中的一个目录。
- 文件全路径:表示完整的 URL 路径。
- 全路径正则表达式:表示一个用于匹配完整 URL 路径的正则表达式。要指定该选项,请 提交工单。
|
规则内容 | 表示规则中的匹配值。多个匹配值之间以分号(;)分隔,总长度不能超过 1,024 个字符,不能包含以下字符: - 双斜杠(//)、空格、美元符号($)、问号(?)、Delete(ASCII code 127)。
另外, - 如果 规则类型 是 文件后缀,则每个匹配值是一个文件后缀,不能以句点(.)开头。例如:
png;txt。 - 如果 规则类型 是 目录,则每个匹配值是一个目录路径,必须以斜杠(/)开头和结尾。例如:
/chs/foods/;/us/birds/。 - 如果 规则类型 是 文件全路径,则每个匹配值是一个 URL 路径,必须以斜杠(/)开头。匹配值可以包含星号(*)用来表示一个或者多个任意字符。例如:
/chs/foods/local*sets;/us/birds/chickadee。 - 如果 规则类型 是 全路径正则表达式,则每个匹配值是一个正则表达式,用于匹配 URL 路径。例如:
^/a{1,2}.*g$。
|
忽略大小写匹配 | 表示匹配值是否是大小写敏感的。 该配置的默认设置是 关闭,表示匹配值是大小写敏感的。例如:规则类型 是 文件后缀,规则内容是 png;txt,忽略大小写 为 关闭。此时,该规则匹配 URL 是 HTTPS://www.EXAMPLE.com/image.png 的请求,但是不匹配 URL 是 https://www.example.com/image.PNG 的请求。 |
缓存策略 | 参见 缓存行为。 |
缓存时间 | 表示请求文件的缓存时长,最小值是 0,最大缓存时长是 3,650 天。 如果您输入 0,则表示不缓存文件。对于匹配该规则的用户请求,CDN 会透传请求到源站。 |
规则生效逻辑
规则列表中的规则具有优先级,优先级最高的规则优先生效。对于一个用户请求,如果某条规则与该请求匹配,只有该规则生效,剩余规则不生效。您可以拖动规则来调整规则的优先级。
更多信息
默认缓存规则
在缓存规则列表中,有一条系统创建的缓存规则。该规则对所有请求生效,是默认缓存规则。该规则的配置为 "遵循源站 + 补充缓存(关)"。该规则的优先级最低。您无法修改或者删除该规则,您也无法调整该规则的优先级。
如果一个用户请求无法匹配您创建的任何缓存规则,该请求将匹配这条系统创建的缓存规则。
CDN 如何判断缓存文件是否过期
当 CDN 收到一个用户请求时,如果请求的文件已被 CDN 缓存并且以下条件满足,CDN 判定缓存未过期并将缓存文件发送给用户:
- CDN 收到请求的时间 > 缓存文件的缓存时间点 + 匹配该请求的缓存规则中所指定的缓存时长
缓存规则对 CDN 处理用户请求的影响
当 CDN 收到一个用户请求时,CDN 处理该请求的步骤如下:
- 确定匹配该用户请求的缓存规则。
- 基于该缓存规则的配置,确定是否需要查找缓存中的文件。
- 如果缓存规则的配置为不缓存文件,CDN 直接向源站请求该文件。当收到文件后,CDN 将该文件发送给用户。流程结束。
- 否则,CDN 查找缓存中的文件。
- 判断缓存中是否存在该文件。
- 如果该文件存在并且未过期,CDN 将缓存的文件发送给用户。流程结束。
- 如果该文件存在但已过期,CDN 进行 回源校验,也就是向源站校验该文件是否有更新。回源校验有以下结果:
- 源站上该文件没有更新:在这个情况下,CDN 将缓存的文件发送给用户。流程结束。
- 源站上该文件有更新:在这个情况下,源站的响应中已包含了最新的文件。继续步骤 4。
- 如果该文件不存在,CDN 向源站请求该文件。继续步骤 4。
- 当收到文件后,CDN 将该文件发送给用户。
- 基于该缓存规则的配置,CDN 缓存收到的文件。
文件分片的缓存过期时间
当 CDN 收到一个 Range 请求,如果请求的分片已被 CDN 缓存,CDN 使用以下步骤判断缓存中的分片是否已过期:
- 对于该分片所对应的文件,在缓存中查找该文件的所有分片。
- 在这些分片中(包括完整文件,如果存在),确定最早被缓存的那个分片,并获取该分片的缓存时间点。
- 使用以下公式计算请求分片的过期时间:
- 过期时间 = 步骤 2 中的缓存时间点 + 匹配该 Range 请求的缓存规则中所指定的缓存时长。
- 判断缓存中的分片是否已过期。
- 如果 CDN 收到该 Range 请求的时间晚于步骤 3 中的过期时间,则 CDN 判定缓存中的分片已过期。
- 否则,CDN 判定缓存中的分片未过期。
示例
对于源站上的一个文件,CDN 在某一天的不同时间点收到了以下请求:
- 09:00:CDN 收到了该文件的分片 A 的请求。分片 A 的缓存时间点是 09:01。
- 10:00:CDN 收到了分片 B 的请求。分片 B 的缓存时间点是 10:01。
- 11:00:CDN 收到了完整文件的请求。完整文件的缓存时间点是 09:01。
- 13:02:CDN 又收到了分片 B 的请求。
对于最后收到的请求,假设匹配该请求的缓存规则中所指定的缓存时长是 4 小时。由于缓存过期时间是 13:01,CDN 判定缓存中分片 B 已过期。
CDN 不缓存源站响应的情况
在以下任意情况下,CDN 不会缓存源站响应。并且,您无法使用缓存规则改变 CDN 的行为。
- 源站响应中
Content-Length 头部的值为 0。 - 用户请求所使用的方法既不是 GET,也不是 HEAD。
- 源站响应状态码不是 2xx,并且您未对该状态码配置 状态码缓存。
- 用户请求使用 HEAD 方法,并且源站响应中包含
Transfer-Encoding:chunked 头部。
在以下情况下,CDN 默认不缓存源站响应。然而,您可以创建缓存规则改变 CDN 的缓存行为。
- 源站响应包含
Expires 头部,并且该头部值所表示的时间早于 CDN 收到用户请求的时间。
CDN 处理 "Cache-Control: no-cache" 的方式
如果源站响应中包含 Cache-Control : no-cache,CDN 的默认缓存行为如下:
- 如果加速域名是在 2024年3月15日之前(不包含 3月15日)创建,CDN 缓存文件。但是该缓存文件会立刻被标记为过期。对于之后收到该文件的请求,CDN 会进行 回源校验。
- 如果加速域名的创建日期晚于 2024年3月15日(包含 3月15日),CDN 不会缓存文件。
然而,您可以创建缓存规则改变 CDN 的缓存行为。
强制缓存更新
假设 CDN 缓存中的某个文件还未过期,但是源站上该文件已经被更新了。您需要用户获取该文件的最新版本。
在这个情况下,您可以在 CDN 中对该文件进行 刷新 操作。刷新操作强制使 CDN 将该文件标记为已过期。之后,如果收到该文件的用户请求,CDN 会进行 回源校验。获取到更新文件后,CDN 将更新的文件发送给用户并缓存该更新文件。
回源校验
当一个缓存文件过期后,如果 CDN 收到了该文件的请求,CDN 向源站请求该文件。但是如果之前随该文件缓存的源站响应头中存在 ETag 或者 Last-Modified,CDN 会在回源请求中包含相应的头部。这些头部用于与源站确认该文件是否有更新。回源校验的逻辑如下:
- 如果
ETag 存在,回源请求中会包含 If-None-Match 头部。该头部的值就是 ETag 的值。 - 如果
ETag 不存在但是 Last-Modified 存在,回源请求中会包含 If-Modified-Since 头部。该头部的值就是 Last-Modified 的值。
当收到包含 If-None-Match 或 If-Modified-Since 头部的请求时,源站服务器会基于该头部检查该文件是否已更新。
- 如果该文件已更新,源站响应中会包含请求文件,响应状态码是 200。
- 如果该文件没有更新,源站响应中不会包含请求文件,响应状态码是 304。
基于源站响应中的状态码,CDN 执行以下某个操作:
- 如果状态码是 304,CDN 将缓存的文件发送给用户。同时,CDN 获取源站响应中的
Date 头部,然后将缓存文件的缓存时间更新为该头部值。 - 如果状态码是 200,CDN 将更新的文件发送给用户并缓存更新的文件。