本文档介绍火山引擎内容分发网络(CDN)中的缓存规则。
缓存规则决定了 CDN 如何缓存从源站获取的文件。默认情况下,CDN 遵循源站响应头中对于缓存的指示来缓存收到的文件,参见 默认缓存规则。源站响应头指示 CDN 是否需要缓存收到的文件,以及缓存的时长。
如果您需要修改 CDN 对特定请求的缓存行为,可以在 CDN 中创建缓存规则。例如,您可以创建缓存规则,指定 CDN 始终对满足以下条件的请求缓存请求文件,缓存时长为 3 天:
/img/loca-food/
。Chinese
开头。.png
。说明
随请求文件一起被缓存的还有源站响应中的响应状态码和响应头。也就是说,CDN 缓存的是完整的源站响应。在 CDN 响应用户请求时,除了请求文件,源站响应状态码和响应头也包含在 CDN 对用户请求的响应中。
缓存文件时,CDN 将源站响应中 Date
头部的值记录为该文件的缓存时间点。
当 CDN 收到一个用户请求,如果请求的文件在 CDN 的缓存中并且 CDN 判断缓存的文件未过期,该请求被认为是缓存命中。
如果一条缓存规则中的过期时间为 0
,则对于匹配该缓存规则的用户请求,CDN 会直接向源站请求文件。另外,对于这些请求,CDN 不会缓存来自源站的文件。
当 CDN 收到来自源站的文件时,缓存规则所指示的 CDN 缓存行为如下表所示:
缓存策略 | 策略配置 | 缓存行为 | 缓存时间 |
---|---|---|---|
遵循规则 | 强制缓存(开) | 忽略源站响应头的不缓存指示,始终缓存文件。 | 遵循规则中配置的 过期时间。 |
强制缓存(关) | 不忽略源站响应头的不缓存指示。如果缓存行为未指定,文件会被缓存。 | ||
遵循源站 | 补充缓存(开) | 遵循源站响应头的缓存指示。如果缓存行为未指定,文件会被缓存。 | 遵循响应头指定的缓存时长。如果缓存时长未指定,遵循规则中配置的 过期时间。 |
补充缓存(关) | 遵循源站响应头的缓存指示。如果缓存行为未指定,文件不缓存。 | 遵循源站响应头指定的缓存时长。 |
关于缓存行为的详细描述,参见 缓存行为的详细描述。
在缓存规则列表中,有一条系统创建的缓存规则。该规则指示 CDN 遵循源站响应头的缓存指示缓存收到的文件。该规则的优先级最低。您无法修改或者删除该规则,您也无法调整该规则的优先级。
如果一个用户请求无法匹配您创建的任何缓存规则,该请求将匹配这条系统创建的缓存规则。
登录 火山引擎内容分发网络控制台。
在左侧导航栏,点击 域名管理。
在 域名管理 页面,找到需要配置的域名,点击 管理。
在域名页面上,点击 缓存配置 页签。
在页面右上方,点击 编辑配置。
在 节点缓存规则 下方,点击 新增规则。您最多可以添加 50 条规则。
根据 配置说明 进行设置。
配置完成后,在页面右上方,点击 提交编辑。
配置 | 说明 |
---|---|
规则类型 | 表示规则中的匹配条件。该配置有以下选项:
|
规则内容 | 表示规则中的匹配值。多个匹配值之间以分号(;)分隔,总长度不能超过 1,024 个字符,不能包含以下字符:
另外,
|
忽略大小写匹配 | 表示匹配值是否是大小写敏感的。 该配置的默认设置是 关闭,表示匹配值是大小写敏感的。例如:规则类型 是 文件后缀,规则内容是 |
缓存策略 | 参见 缓存行为的详细描述。 |
缓存时间 | 表示请求文件的缓存时长,最小值是 |
规则列表中的规则具有优先级,优先级最高的规则优先生效。对于一个用户请求,如果某条规则与该请求匹配,只有该规则生效,剩余规则不生效。您可以拖动规则来调整规则的优先级。
说明
关于 CDN 处理 Cache-Control: no-cache
的方式,参见 CDN 处理 "Cache-Control: no-cache" 的方式。
缓存策略 | 策略配置 | 缓存行为 | 缓存时间 |
---|---|---|---|
遵循规则 | 强制缓存(开) | 表示 CDN 始终缓存请求文件。 | 遵循规则中 缓存时间 的配置。 |
强制缓存(关) |
| ||
遵循源站 | 补充缓存(开) |
|
|
补充缓存(关) |
| 遵循响应头指定的缓存时长。 |
当 CDN 收到一个用户请求时,如果请求的文件已被 CDN 缓存并且以下条件满足,CDN 判断缓存未过期并将缓存文件发送给用户:
当 CDN 收到一个用户请求时,CDN 处理该请求的步骤如下:
确定匹配该用户请求的缓存规则。
基于该缓存规则的指示,确定是否需要查找缓存中的文件。
如果缓存规则指示 CDN 绕过缓存,CDN 直接向源站请求该文件。当收到文件后,CDN 将该文件发送给用户。另外,CDN 也不缓存该文件。流程结束。
否则,CDN 查找缓存中的文件。
判断缓存中是否存在该文件。
如果该文件存在并且未过期,CDN 将缓存的文件发送给用户。流程结束。
如果该文件存在但已过期,CDN 进行 回源校验,也就是向源站校验该文件是否有更新。回源校验有以下结果:
源站上该文件没有更新:在这个情况下,CDN 将缓存的文件发送给用户。流程结束。
源站上该文件有更新:在这个情况下,源站的响应中已包含了最新的文件。继续步骤 4。
如果该文件不存在,CDN 向源站请求该文件。继续步骤 4。
当收到文件后,CDN 将该文件发送给用户。
基于该缓存规则的指示,CDN 缓存收到的文件。
当 CDN 收到一个 Range 请求,如果请求的分片已被 CDN 缓存,CDN 使用以下步骤判断缓存的分片是否已过期:
对于该分片所对应的文件,在缓存中查找该文件的所有分片。
在这些分片中(包括完整文件,如果存在),确定最早被缓存的那个分片,并获取该分片的缓存时间点。
使用以下公式计算请求分片的过期时间:
判断缓存的分片是否已过期。
如果 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 的行为。
源站响应中 Content-Length
头部的值为 0
。
用户请求所使用的方法既不是 GET,也不是 HEAD。
源站响应状态码不是 2xx,并且您未对该状态码配置 状态码缓存。
用户请求使用 HEAD 方法,并且源站响应中包含 Transfer-Encoding:chunked
头部。
在以下任意情况下,CDN 不缓存源站响应。然而,您可以创建缓存规则改变 CDN 的缓存行为。
源站响应包含 Cache-Control: max-age = 0
或者 Cache-Control: s-maxage = 0
头部。如果这两个头部同时存在,Cache-Control: s-maxage
的优先级高。
源站响应包含 Expires
头部,并且该头部值所表示的时间早于 CDN 收到用户请求的时间。
响应头 Cache-Control : no-cache
指示 CDN 可以缓存收到的文件。但是在 CDN 在将该缓存文件发送给用户之前,CDN 需要进行 回源校验。
如果您的加速域名收到了这类文件的请求,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 收到的该文件的每个请求,CDN 都会进行回源校验。
如果状态码是 200,CDN 将更新的文件发送给用户并缓存更新的文件。