配置CDN缓存过期时间

更新时间:
复制为 MD 格式

通过配置缓存过期时间规则,可以精细化控制CDN节点的资源缓存时长,以平衡内容更新、访问性能与回源成本。此文档介绍缓存规则的工作原理、配置方法、验证、排障流程及最佳实践。

工作原理

请求到达CDN节点时,系统遵循以下决策流程(序号越小,优先级越高)决定是响应缓存副本,还是回源获取最新内容。

image
  1. 不缓存资源:源站响应pragma:no-cachecache-control:no-cache(或者no-store,或者max-age=0)时,CDN遵循源站的策略,完全不缓存资源。

  2. 遵循控制台缓存规则:CDN控制台为指定目录或文件后缀名设置规则,且源站未配置上述不缓存规则,此时控制台缓存规则为最高优先级策略。

    • 多条控制台缓存规则匹配时的优先级逻辑:

      场景

      优先级逻辑

      示例

      权重不同

      权重值(1-99)大的规则优先生效。

      规则A(目录/image/,权重50)和规则B(后缀.jpg,权重90)都匹配 image/a.jpg,则规则B生效。

      权重相同

      先创建的规则优先生效。

      为域名配置权重同为60的目录规则(/static/)和后缀规则(.js),若目录规则创建时间早于后缀规则,则 /static/app.js 命中目录规则。

    • 请求命中某条缓存规则后,不再继续匹配其他规则。

    • 默认情况下,若源站响应 Pragma: no-cache 或 Cache-Control: no-cache/no-store/max-age=0CDN节点不缓存该资源。如果需要强制缓存资源,可以在控制台配置缓存过期时间时勾选忽略源站不缓存标头

  3. CDN遵循源站缓存策略:若请求未命中任何CDN控制台规则,或命中的规则开启了优选遵循源站缓存策略,此时CDN将遵循源站的HTTP响应标头。响应头的优先级由高至低为:cache-control>expires>last-modified>ETag

    响应头

    CDN 如何处理

    注意事项与示例

    Cache-Control

    优先用 s-maxageCDN 缓存时长),其次 max-age

    示例:s-maxage=86400, max-age=3600 

    Expires

    过期时间,仅当无 Cache-Control 时生效。

    示例:Expires: Wed, 21 Oct 2025 07:28:00 GMT

    Last-Modified

    Last-Modified是一个时间戳,表示资源最后被修改的时间。

    缓存时间计算规则如下:

    (当前时间-last-modified)* 0.1,计算结果在10秒~3600秒及之间的,取计算结果时间;小于10秒的,按照10秒处理;大于3600秒的,按照3600秒处理。

    示例:Last-Modified: Wed, 21 Oct 2023 07:28:00 GMT

    ETag

    ETag是服务器为每个资源生成的一个唯一标识符,通常是一个哈希值或版本号。

    ETag默认缓存10秒。

    示例:ETag: "abc123"

  4. CDN不缓存策略:若没有命中CDN控制台的缓存规则,并且源站也没有返回Cache-Control等缓存响应头,则CDN执行不缓存策略。

说明

CDN仅对源站响应200, 203, 206, 300, 301, 308, 410状态码的请求执行缓存策略。如需缓存其他状态码的请求(例如404),需在 缓存配置 > 状态码过期时间 页面设置。

操作步骤

控制台(推荐)

  1. CDN控制台的域名管理页,单击目标域名右侧的管理

  2. 缓存配置 > 缓存过期时间页面单击添加,配置缓存规则。

    image

    参数名

    说明

    默认值/示例

    类型

    支持按目录或文件后缀名指定资源范围。
    • 目录:为路径下所有资源统一设置缓存规则。
    • 文件后缀名:为指定类型的文件统一设置缓存规则。

    目录、文件后缀名

    地址

    根据所选类型填写:
    • 目录:以 / 开头(如 /static/),/ 可匹配所有路径,每次仅支持添加一条。
    • 文件后缀名:输入一个或多个后缀,用英文逗号分隔(如 jpg,png,css),区分大小写,不支持竖线(|)或其他符号。

    /static/jpg,png,css

    过期时间

    资源在CDN节点的缓存时长,最长3年。
    • 不常更新的静态资源(如图片、安装包):建议 ≥ 1 个月。
    • 频繁更新的静态资源(如 JS/CSS):建议设置为较短时间(如 1~7 天)。
    • 动态内容(如 PHP/JSP):建议设为 0 秒(不缓存)。

    0 秒~3 年

    优先遵循源站缓存策略

    默认关闭。开启后,优先采用源站缓存策略,覆盖本规则配置。

    关闭

    忽略源站不缓存标头

    开启后,CDN 将忽略源站返回的以下不缓存指令:Cache-Control: no-storeno-cachemax-age=0,以及 Pragma: no-cache,仍按CDN控制台规则缓存。

    关闭

    客户端跟随CDN缓存策略

    开启后,CDN 会将自身生效的缓存策略(如 max-age=3600)通过响应头返回给客户端。

    关闭

    强制内容重新验证

    仅在过期时间设为 0 秒时生效。
    • 关闭(默认,等同于缓存策略 no-store):CDN节点不缓存文件,每次请求都需要回源获取内容。
    • 开启(等同于缓存策略 no-cache):CDN节点会缓存文件,但每次请求都需要回源验证缓存内容(304机制)。适用于需要实时验证但希望减少源站带宽压力的场景。

    关闭

    权重

    规则优先级,取值 1~99,数值越大优先级越高。当多条规则匹配同一资源时,权重值大的规则优先生效;若权重相同,先创建的规则优先生效。建议为具体路径或后缀设置高权重,为根目录 / 设置低权重,以实现精细化控制。

    1~99

    规则条件

    可基于请求中的参数(如 Header、URL 参数等)进一步限定规则生效范围。默认不使用;如需配置,请通过规则引擎管理。引用规则条件时,按所关联规则条件的优先级匹配,而非按功能自身的配置顺序匹配。

    不使用

API

调用BatchSetCdnDomainConfig接口,可以批量配置域名。更多功能参数的配置方法,敬请参考域名配置功能函数

使规则变更立即生效

配置变更或新增规则,仅对新缓存的资源生效。变更前已缓存的资源,将继续沿用旧的缓存策略直至过期。

要使新规则立即对全网生效,必须手动清理已有缓存。如果是规则变更,通过刷新资源功能执行刷新操作;如果是新增规则,通过预热资源功能执行预热操作。

生效验证

配置完成后,可通过curl命令或浏览器开发者工具查看资源的HTTP响应标头,以判断缓存是否按预期工作。

1. 执行验证命令

在终端上执行以下命令进行测试。

curl -I "https://your.domain.com/path/to/file.jpg"

2. 解读关键响应头

响应标头

常见值与解读

X-Cache

指示请求是否命中CDN缓存。
HIT:命中缓存。
MISS:未命中缓存,请求已回源获取资源。

Cache-Control

开启"客户端跟随CDN缓存策略"后,此标头会显示CDN传递给浏览器的缓存指令,如 max-age=3600

X-Swift-CacheTime

资源在CDN节点上配置的缓存总时长,单位为秒。

应用于生产环境

  • 版本化文件名(推荐):更新静态资源(如style.css)时,使用带版本或哈希值的新文件名(如style-v2.cssstyle-a1b2c3d.css),并更新HTML中的引用。此方式无需手动刷新CDN缓存,可确保用户立即获取最新内容,是推荐的缓存更新方式。

  • 动静分离:为动态和静态资源使用不同域名或目录路径,并配置独立的、高权重的缓存规则,以避免策略混淆。例如,为/static/目录下的所有资源设置长缓存,为/api/目录下的资源设置不缓存。

  • 善用浏览器缓存:开启"客户端跟随CDN缓存策略",可减少对CDN的重复请求,提升加载速度并节省CDN流量。

  • 避免缓存时间过短:过短的缓存时间会导致CDN频繁回源,无法起到加速效果,反而增加源站的流量消耗和成本。

  • 注意缓存时间过长:过长的缓存时间会导致客户端获取数据更新不及时。对于需频繁更新的内容,务必配合刷新缓存操作或使用版本化文件名。

HTTP协议缓存控制机制说明

HTTP协议中定义了三种不同类型的协议头部来实现缓存控制相关的机制:

  1. 过期时间校验机制

    客户端在向服务端请求资源的过程中,双方将为资源约定一个过期时间,在该过期时间之前,该资源(缓存副本)就是有效的,过了过期时间后,该资源(缓存副本)就会失效。

    HTTP协议中,控制缓存过期时间的Header常见的有下面这些:

    头部名称

    协议版本

    作用

    示例值

    类型

    Pragma

    HTTP/1.0

    Pragma用于表示内容是否为不缓存,通常取值no-cache,表示文件不缓存,常被用来兼容只支持HTTP1.0 协议的Server。

    Pragma:no-cache

    请求/响应

    Expires

    HTTP/1.0

    Expires响应头包含日期/时间,表示在此时间之后,缓存内容将会过期。

    如果使用了无效的日期,比如0,则代表该资源已经过期。

    Expires: Wed, 21 Oct 2022 07:28:00 GMT

    响应

    Cache-Control

    HTTP/1.1

    Cache-Control响应头可以设置不同的指令来实现灵活的缓存控制,是目前主流客户端(如浏览器等)用于控制缓存的重要头部。

    以下三个示例表示文件不缓存:

    • Cache-Control:no-cache

    • Cache-Control:no-store

    • Cache-Control:max-age=0

    表示缓存有效期1小时的示例:Cache-Control:max-age=3600

    请求/响应

  2. 资源标签验证机制

    客户端在首次向服务端请求资源的过程中,服务端将在响应头中带上资源标签,资源标签可以作为客户端再次请求同一资源时的校验标识。客户端再次请求同一资源时,请求头中将会携带资源标签,若服务端校验后认为该资源没有更新,则响应HTTP状态码304,告诉客户端该资源没有更新,客户端可以继续使用本地缓存;若服务端校验后发现资源标签不匹配,则告诉客户端该资源已经被修改或者已经过期,客户端需要重新获取资源内容。

    HTTP协议中,控制缓存版本的Header常见的有下面这些:

    头部名称

    协议版本

    作用

    示例值

    类型

    Last-Modified

    HTTP/1.0

    Last-Modified表示资源的最后修改时间。

    Last-Modified: Wed, 21 Oct 2015 07:28:00 GMT

    响应

    ETag

    HTTP/1.1

    ETag表示当前资源特定版本的唯一标识符。

    对比ETag能判断资源是否变化,如果没有改变,源站服务器不需要发送完整的响应。

    ETag: "33a64df551425fcc55e4d42a148795d9f25f89d4"

    响应

  3. 多副本协商机制

    缓存软件使用关键字索引在磁盘中缓存的对象,在HTTP/1.0中使用资源的URL作为关键字,但可能存在不同的资源基于同一个URL的情况,要区别它们还需要客户端提供更多的信息,例如:Accept-Language、Accept-Charset等头部,为了支持这种内容协商机制(content negotiation mechanism),HTTP/1.1在响应消息中引入了Vary头部,该头部列出了请求消息中需要包含哪些头部用于内容协商。

    多副本协商机制通常使用HTTP协议的Vary头部来区分不同的缓存副本,实现不同的客户端请求同一个资源的时候可以拿到不同缓存副本:

    头部名称

    协议版本

    说明

    示例值

    类型

    Vary

    HTTP/1.1

    常用示例:

    • 服务端指定Vary: Accept-Encoding,告知接收端(例如:CDN节点)对于该资源需缓存两个版本(压缩和未压缩)。客户端向CDN请求同一个资源时,老版本浏览器获取未压缩资源(避免兼容性问题),新版本浏览器获取压缩资源(减少数据传输流量)。

    • 服务端指定Vary: User-Agent,用来识别发送请求的浏览器类型,告知接收端(例如:CDN节点),根据不同的浏览器类型缓存对应版本的资源。

    Vary: Accept-Encoding

    Vary: Accept-Encoding,User-Agent

    响应

常见问题

修改缓存配置或源站内容更新后,如何确保用户立即访问到最新内容?

CDN缓存规则变更仅对新请求生效,已缓存的旧资源需手动清理。可执行以下操作:

  1. 刷新缓存:登录CDN控制台,进入域名管理 > 刷新预热页面,选择"URL刷新"或"目录刷新",输入需要更新的文件路径或目录,提交刷新任务。这将强制CDN节点删除旧缓存,下次访问时重新回源获取最新内容。

  2. 强制刷新:若常规刷新未生效,可调用 RefreshObjectCaches API 并将 Force 参数设为 true 进行强制刷新。

  3. 清除本地缓存:若CDN已更新但浏览器仍显示旧内容,请清除浏览器缓存或使用无痕模式访问。

  4. 预防建议:对于频繁更新的静态资源(如HTML、JS、CSS),建议采用版本化文件名(如 style.v2.css)或在源站配置较短的缓存时间,减少手动刷新频率。

如何配置CDN仅缓存静态文件(如图片、CSS、JS),而让动态页面(如PHP、ASPX、API接口)直接回源?

建议采用"黑白名单"结合权重的配置方式:

  1. 创建高权重静态缓存规则:添加一条或多条规则,类型选择"文件后缀名",地址填写 jpg,png,css,js 等静态后缀,设置较长的缓存时间(如1个月),权重设为较高值(如90~99)。

  2. 创建低权重动态不缓存规则:添加一条规则,类型选择"目录",地址填写 /(根目录),缓存时间设为 0 秒(不缓存),权重设为较低值(如1~10)。

  3. 针对特定动态路径优化:若某些动态路径(如 /api/ 或 /wp-admin/)需要严格不缓存,可单独添加目录规则,路径设为该目录,缓存时间 0 秒,权重设为最高(如99),确保优先匹配。

注意:CDN无法完全绕过节点直接回源,即使缓存时间为 0,请求仍会经过CDN节点进行转发和鉴权。

配置缓存规则后,为什么测试请求仍然回源或未命中缓存?

可按以下步骤排查:

  1. 检查配置生效状态:确认控制台缓存配置状态显示为"成功"。

  2. 验证匹配优先级:若存在多条规则,确保目标路径命中的规则权重最高。例如,具体目录(如 /static/)的权重应高于根目录(/)的默认规则。

  3. 检查源站响应头:若源站返回 Cache-Control: no-cache/no-store/max-age=0 或 Pragma: no-cache,且CDN未开启"忽略源站不缓存标头",CDN将遵循源站指令不缓存。建议开启该选项或调整源站配置。

  4. 确认请求方法:使用 curl -voa(GET请求)而非 curl -I(HEAD请求)进行测试,因为HEAD请求可能不会触发L1节点对资源体的真实缓存逻辑,导致误判为MISS。

  5. 检查URL参数:若URL带参数,确认是否开启了"忽略URL参数"功能。若未开启,不同参数的URL被视为不同资源;若开启,则视为同一资源。

源站返回了 Cache-Control: no-cache 或 private,为什么CDN还是不缓存?如何强制CDN缓存?

默认情况下,CDN会遵循源站返回的 Cache-Control: no-cache/no-store/max-age=0Pragma: no-cache 或 Cache-Control: private 等指令,导致资源不被CDN节点缓存。

若希望忽略源站的这些不缓存指令,强制按CDN控制台配置的规则进行缓存,请进入CDN控制台"缓存过期时间"配置页面,勾选忽略源站不缓存标头选项。开启后,CDN将忽略源站的不缓存头,依据控制台设置的过期时间缓存资源。

为什么视频播放或大文件下载时,日志中显示大量 206 状态码或多次回源?这正常吗?

这是正常现象。

  1. 206状态码:视频播放器或下载工具通常使用Range请求分段加载资源,每次请求部分内容,服务器返回 206 Partial Content。CDN命中缓存时也会返回 206。

  2. 流量费用:只要客户端向CDN发起请求并接收数据,无论是否命中缓存,均会计入CDN流出流量费用。

  3. 优化建议:确保开启CDNRange回源功能,以便CDN节点可以按需从源站拉取片段并缓存,提高后续分段请求的命中率。同时,建议在客户端或源站配置合理的 Cache-Control 头,利用浏览器本地缓存减少重复请求。

其他缓存相关常见问题,请参见缓存相关常见问题