本文档介绍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加速服务遵循源站响应头的缓存指示缓存收到的文件。该规则的优先级最低。您无法修改或者删除该规则,您也无法调整该规则的优先级。
如果一个用户请求无法匹配您创建的任何缓存规则,该请求将匹配这条系统创建的缓存规则。
您已经添加域名到CDN加速服务。相关操作,请参见添加域名。
登录多云CDN控制台。
配置 | 说明 |
---|---|
规则类型 | 表示规则中的匹配条件。该配置有以下选项:
|
规则内容 | 表示规则中的匹配值。多个匹配值之间以分号(;)分隔,总长度不能超过 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
头部。
源站响应包含 Expires
头部,并且该头部值所表示的时间早于CDN加速服务收到用户请求的时间。
响应头 Cache-Control : no-cache
指示CDN加速服务可以缓存收到的文件。但是在CDN加速服务在将该缓存文件发送给用户之前,CDN加速服务需要进行 回源校验。
如果您的加速域名收到了这类文件的请求,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加速服务将更新的文件发送给用户并缓存更新的文件。