如何基于文件最后更新日期刷新阿里云CDN缓存?解决Blazor WASM缓存崩溃
阿里云CDN通配符域名下Blazor WASM更新缓存问题解决方案
一、从缓存规则根源规避问题
Blazor WASM的静态资源(如_framework下的文件)自带哈希命名,只有index.html这类入口文件会重复命名,针对性配置缓存策略:
- 给
index.html设置0缓存时长(或5分钟短缓存),强制每次请求回源拉取最新版本 - 对带哈希的资源(
*.dll.gz、*.js等)设置30天长缓存,哈希变化才会更新,不会触发缓存冲突
这种方式无需频繁手动刷新,从配置层面减少缓存问题。
二、合法批量刷新通配符域名
阿里云CDN不支持复杂正则,但支持官方规定的*通配符,直接用以下格式刷新:
- 所有子域名的入口文件:
https://*.xxx.com/index.html - 所有子域名的框架资源:
https://*.xxx.com/_framework/*
注意:*只能用在域名或路径的分段位置,不能混合其他正则字符,这是平台允许的合法写法,之前的正则格式不符合规则所以报错。
三、自动刷新:OSS触发器+函数计算配置修正
按以下步骤配置自动刷新:
- 创建函数计算服务:选Python/Node.js运行环境,创建空白函数
- 编写刷新CDN的函数代码(Python示例):
import json import aliyunsdkcore from aliyunsdkcdn.request.v20180510.RefreshObjectCachesRequest import RefreshObjectCachesRequest def handler(event, context): # 解析OSS触发事件,获取更新文件路径 event_obj = json.loads(event) oss_info = event_obj['events'][0]['oss'] object_key = oss_info['object']['key'] # 根据OSS存储结构生成CDN刷新路径,按需调整 sub_domain = object_key.split('/')[0] # 假设OSS目录名对应子域名 refresh_url = f"https://{sub_domain}.xxx.com/{object_key}" # 初始化CDN客户端(需配置RAM权限:AliyunCDNFullAccess) client = aliyunsdkcore.client.AcsClient('<你的AccessKeyId>', '<你的AccessKeySecret>', 'cn-hangzhou') request = RefreshObjectCachesRequest() request.set_accept_format('json') request.set_ObjectPath(refresh_url) request.set_RefreshType("File") # 发送刷新请求 response = client.do_action_with_exception(request) return json.loads(response) - 配置OSS触发器:
- 进入函数计算的触发器管理,添加OSS触发器
- 关联目标OSS Bucket,触发事件选
PutObject和DeleteObject - 设置触发前缀(如
_framework/或index.html,只监听需刷新的文件)
- 配置RAM权限:给函数计算服务角色添加
AliyunCDNFullAccess权限,确保能调用CDN刷新接口
四、Blazor WASM打包优化
发布时确保启用静态资源哈希(默认已开启),更新后的资源文件名会随内容变化,CDN会自动拉取新文件,仅需刷新index.html即可。
内容的提问来源于stack exchange,提问作者Brett
相关产品推荐
相关产品推荐

