在使用边缘安全加速 ESA加速静态资源时,ESA会将源站上的资源缓存到距离客户端最近的ESA节点上。当您访问该静态资源时,可以直接从ESA的缓存节点上获取,有效避免通过较长的链路回源,提高资源访问效率。阿里云ESA的所有节点都包含缓存软件,在用户请求或者源站响应资源经过ESA节点时,缓存软件会根据需要对源站资源进行缓存,并设定缓存过期时间。
默认缓存策略
客户端请求只有在进入ESA缓存组件的情况下,缓存配置才会生效。客户端请求是否进入缓存组件需要按顺序经过三重判断,相关说明如下:
用户请求类型判断:默认只有GET、HEAD请求类型才能进入缓存组件。
缓存规则判断:判断用户请求是否符合缓存规则中设定的规则条件,如果符合,用户请求将会使用缓存规则中设定的缓存配置(缓存规则的生效优先级高于全局缓存配置),具体请参见缓存配置生效逻辑。
请求文件类型判断:判断用户请求需要访问的文件类型是否符合默认缓存的文件扩展名中的文件类型,如果符合,用户请求将会使用全局配置中设定的缓存配置。
默认缓存的文件扩展名
默认情况下,用户请求的资源的文件后缀是下面这些类型时,用户请求会经过缓存模块(即对应绕过缓存功能的默认规则),至于资源在缓存模块上的缓存过期时间,还需要按该资源命中的缓存规则。
如果要缓存的资源类型不在以下文件类型中,可以参阅规则以创建缓存所需资源的规则策略。
文件类型 | 文件扩展名说明 |
文档文件 |
|
图像文件 |
|
音频文件 |
|
视频文件 |
|
压缩文件 |
|
执行文件(可执行程序/安装包) |
|
字体文件 |
|
脚本与代码文件 |
|
设计与矢量图形文件 |
|
缓存配置生效逻辑
对于源站响应的200、203、206、300、301、308、410状态码,缓存过期时间按以下规则生效。
节点缓存过期时间功能有四种模式,这四种模式分别具备不同的缓存生效逻辑:
优先遵循源站缓存策略(如果存在),否则使用默认缓存策略:如果源站响应信息中带有用于设置缓存策略的响应标头字段,包括:
Cache-Control、Expires、Last-Modified、ETag,则遵循源站的缓存策略;如果源站响应信息中不带有Cache-Control、Expires、Last-Modified、ETag其中任一字段,则遵循ESA的默认缓存策略。优先遵循源站缓存策略(如果存在),否则不缓存:如果源站响应信息中带有用于设置缓存策略的响应标头字段:
Cache-Control,则遵循源站的缓存策略;如果源站响应信息中不带有Cache-Control字段,则不缓存。不缓存:ESA节点收到的所有源站响应资源均不缓存。
忽略源站缓存策略,使用自定义缓存过期时间:忽略源站响应信息中的缓存策略的响应标头字段,包括:
Cache-Control、Expires、Last-Modified、ETag,使用ESA上设定的缓存过期时间。
异常状态码缓存规则
对于204、305、404、405、414、424、429、500、501、502、503和504状态码,缓存规则如下:
如果源站返回set-cookie响应头,ESA不缓存。
如果源站没有返回
set-cookie响应头,则判断ESA控制台是否配置状态码过期时间:若已配置,则遵循ESA控制台配置的状态码过期时间来缓存,配置多条规则时生效方式请参考多条规则生效优先级说明。
若未配置,则按照源站设置的
Pragma、Cache-Control或者Expires响应头来缓存。
如果源站也没有配置
Pragma、Cache-Control或者Expires响应头,则默认缓存1秒。
对于302、307和403状态码,缓存规则如下:
如果源站返回
set-cookie响应头,ESA不缓存。如果源站没有返回
set-cookie响应头,则判断ESA控制台是否配置状态码过期时间:若已配置,则遵循ESA控制台配置的状态码过期时间来缓存,配置多条规则时生效方式请参考多条规则生效优先级说明。
若未配置,则按照源站设置的
Pragma、Cache-Control或者Expires响应头来缓存。
如果源站也没有配置
Pragma、Cache-Control或者Expires响应头,则不缓存。
对于其他异常状态码,如400状态码,缓存规则如下:
如果源站返回
set-cookie响应头,ESA不缓存。如果源站没有返回
set-cookie响应头,则遵循ESA控制台配置的状态码过期时间来缓存,配置多条规则时生效方式请参考多条规则生效优先级说明。其他场景不缓存。
对于采用range方式回源的请求,ESA节点如果收到源站响应的非206状态码,则ESA节点会删除已缓存的分片文件(回源超时不会删除缓存文件)。
Range回源情况下,源站会把一个大文件分割成多个小的文件分片来返回给ESA节点。比如有个文件被分割成了10个分片,ESA节点已经缓存了5个分片,在请求第6个分片时,源站响应了5xx状态码,这时会把前面已经缓存的5个分片全部删除。
缓存响应信息说明
ESA节点提供了规范化响应信息,以方便用户调试HTTP请求和响应,与缓存相关的响应标头包含以下内容:
Ali-Swift-Global-Savetime: 表示该资源首次进入到ESA边缘节点(由站点的缓存架构决定,可能是L2节点,也可能其他的缓存层级节点)的时间。格式为Unix时间戳,例如:1745053111,表示2025-04-19 16:58:31。Date:表示源站响应该资源给ESA节点的时间。ESA节点在与源站对该资源进行重新验证(回源请求中携带
If-Modified-Since标头或If-None-Match标头),并且源站响应状态码为304的情况下,将会更新Data信息。格式为GMT(格林尼治标准时间)时区的时间格式,例如:
Sat, 19 Apr 2025 08:58:31 GMT。
X-Site-Cache-Status: 表示本次请求的资源在ESA节点上的缓存状态,不同状态的说明详见下表。状态
说明
HIT
在ESA节点的缓存中找到了该资源。
MISS
在ESA节点的缓存中找不到该资源,而是由源站服务器提供该资源。
EXPIRED
该资源已在ESA节点的缓存中找到,但已过期,并由源站服务器提供(源站响应状态码为200或206)。
STALE
该资源是由ESA的缓存提供的,但已过期,具体分为三种情况:
ESA设置为优先遵循源站缓存策略,且源站响应中设置了
Cache-Control:stale-while-revalidate=<seconds>,在指定的时间内,ESA在回源重新验证该资源的同时响应过期缓存给客户端。ESA设置为优先遵循源站缓存策略,且源站响应中设置了
Cache-Control:stale-if-error==<seconds>,在指定的时间内,如果ESA无法访问源站(源站响应超时)以检索更新的资源,那么将响应过期缓存给客户端。ESA开启了响应过期缓存,如果ESA无法访问源站(源站响应超时)以检索更新的资源,那么将响应过期缓存给客户端。
BYPASS
表示该资源绕过ESA缓存,具体分为两种情况:
ESA未设置为优先遵循源站缓存策略,并且ESA设置缓存时间为0。
ESA设置为优先遵循源站缓存策略,源站响应的
Cache-Control值是这三种之一:no-cache、no-store、max-age=0。
REVALIDATED
该资源由ESA的缓存提供,但是已过期。ESA的回源请求中携带
If-Modified-Since标头或lf-None-Match标头对该资源做了重新验证(源站响应状态码为304)。DYNAMIC
ESA认为该资源为动态内容,并且在ESA上未明确设置针对该资源的缓存策略。该资源由源站服务器提供。
X-Swift-Cachetime: 表示该资源在ESA节点上的缓存过期时间,单位为秒。X-Swift-Cachetime并不完全等于在ESA中设置的缓存过期时间,具体为:X-Swift-Cachetime=Ali-Swift-Global-Savetime+ ESA设置的缓存过期时间 -X-Swift-SaveTime。因此可能出现以下几种情况:X-Swift-Cachetime等于在ESA中设置的缓存过期时间,例如:3600秒。X-Swift-Cachetime略小于ESA设置的缓存过期时间,例如:ESA设置的缓存过期时间为300秒,但是X-Swift-Cachetime为295秒,这种情况可能的原因有以下:L1节点回源L2节点的延迟较大
L1节点与L2节点上的时钟不同步
X-Swift-Cachetime的数值为负数,这种情况可能的原因是用户对ESA设置的缓存过期时间做了调整,客户端访问的时候,L1节点上的缓存已经过期,L2节点上的缓存尚未过期,例如:原先ESA设置的缓存过期时间为3600秒,后来调整到了300秒,客户端首次访问之后过600秒再次访问,这时候收到X-Swift-Cachetime:-300,可通过刷新缓存可以解决。
X-Swift-SaveTime: 表示该资源首次进入客户端请求访问的当前节点(L1节点)的时间。格式为GMT(格林尼治标准时间)时区的时间格式,例如:Sat, 19 Apr 2025 08:58:31 GMT。
文件不缓存策略说明
如果符合以下情况,ESA节点将完全不缓存文件,透传所有对文件的请求。
缓存回源校验策略说明
ESA节点上的缓存文件过期之后,缓存回源校验机制会在下次客户端请求该文件时发挥作用。此时,ESA节点会向源站发起校验请求:如果源文件未发生变化,源站将会响应304 not-modified,ESA节点将会继续使用已缓存文件响应给客户端,无需重新下载文件,有效提升客户端请求的响应速度,并减少源站的响应流量。
特殊策略配置:文件缓存0秒,ESA节点对每次请求都回源校验。
将ESA缓存配置中边缘缓存过期时间的模式设置为优先遵循源站缓存策略(如果存在),否则使用默认缓存策略。并且源站响应满足以下两种情况:
Cache-Control: no-cacheCache-Control: max-age=0
常规策略配置:源站响应缓存校验相关的策略,ESA节点按实际策略执行。
将ESA缓存配置中边缘缓存过期时间的模式设置为优先遵循源站缓存策略(如果存在),否则使用默认缓存策略。并且源站响应满足以下某个缓存校验策略:
must-revalidateproxy-revalidatestale-while-revalidate=secondsstale-if-error=seconds
缓存校验策略说明
策略名称
策略说明
策略示例
must-revalidate
这个指令指示任何缓存(不仅仅是代理缓存,还包括浏览器缓存等)在返回缓存的响应之前,如果资源已经过期,则必须先回源服务器验证资源的新鲜度。即使用户离线或者网络不可用,缓存也不能直接使用过期资源,除非成功验证了资源未发生变化。
Cache-Control: max-age=3600, must-revalidate表示该资源在过期之后必须要回源校验资源的新鲜度。proxy-revalidate
这个指令与
must-revalidate类似,但它只应用于共享缓存(如CDN、代理服务器),而不针对私有缓存(如用户的浏览器缓存)。这意味着,在使用proxy-revalidate时,对于过期的资源,只有共享缓存需要在提供缓存副本前向源站进行有效性验证,而客户端的私有缓存则不受此限制。Cache-Control: max-age=3600, proxy-revalidate表示该资源在过期之后必须要回源校验资源的新鲜度。stale-while-revalidate=seconds
这个指令指示缓存可以在资源过期后,在指定的时间段(以秒为单位)内继续提供旧的缓存版本,同时在后台异步地向源服务器请求最新的内容进行更新。当你希望减少用户等待时间,并且可以接受在短时间内显示可能不是最新鲜的内容时非常有用。
Cache-Control: max-age=3600, stale-while-revalidate=60表示该资源在首次发布后的3600秒(1小时)内被视为新鲜;一旦过期,在接下来的60秒内,仍然可以提供给用户,但同时会尝试从源服务器获取更新。stale-if-error=seconds
这个指令指示当尝试从源服务器获取最新内容失败时(比如服务器宕机或网络错误),这个指令允许节点返回已经过期但仍被缓存的响应。它定义了一个时间段(以秒为单位),在此期间如果遇到错误,可以回退到使用过期的缓存内容。用于提升系统的容错能力,确保即使源服务器不可用,用户也能访问到之前缓存的内容,从而改善用户体验并减少服务中断的影响。
Cache-Control: max-age=86400, stale-if-error=604800表示该资源在首次发布后的86400秒(24小时)内视为新鲜;若在这之后尝试重新验证失败,则在未来的一周(604800秒)内仍可提供最后一次成功的缓存版本。