“为什么我的图片缓存命中率只有60%,明明设置了很久的过期时间?” “接口返回的数据老是旧的,清缓存又怕影响其他资源。”——在CDN调优的日常中,这样的灵魂拷问并不少见,很多人以为只要在CDN后台勾选“缓存”按钮,就能万事大吉,但真相是,缓存策略的颗粒度决定了加速效果的天花板,而“后缀缓存”正是那个最容易被低估的精准武器。

后缀缓存,CDN加速的精准制导武器,你真的会用吗?
技术概念拆解:后缀缓存到底是什么?
先看一个最简单的场景:你的网站上有 logo.jpg 和 index.html 两个资源,按照常理,图片应该缓存一年,HTML页面最多缓存几分钟——因为图片基本不变,而页面内容可能随时更新,但CDN怎么区分它们?靠的就是URL的后缀(扩展名)。
后缀缓存的本质,是一种基于URL末尾文件扩展名的模式匹配规则,它告诉CDN:“只要请求的资源以 .jpg 就按图片类的策略执行;以 .html 就走页面类的策略。” 这个策略不仅包括缓存时长(TTL),还包括是否缓存、缓存键是否忽略查询参数、是否启用协商缓存(ETag/Last-Modified)等。
很多人会把它和“目录缓存”混淆,目录缓存是按路径前缀匹配,/static/* 命中静态目录;而后缀缓存是按文件类型匹配,/api/getUser.json 命中JSON类,两者可以组合使用,但后缀缓存更贴近文件本身的本质属性——一个文件叫什么名字,往往决定了它的更新频率和业务价值。
值得注意的是,后缀缓存并不完美,比如某些动态页面为了SEO伪装成 .html(伪静态),或者某些API使用 .json 但响应内容实时变化,这时单纯靠后缀就会误伤,所以真正的生产环境需要结合实际业务特征做“后缀+路径+header”的多维判断。
方案对比:三种常见的实现方式
市面上的CDN服务商普遍支持三种后缀缓存方案,各有优劣。
控制台规则配置(通用型)
这是最主流的方式,在CDN控制台添加“缓存规则”时,指定文件后缀和对应的缓存时间,例如某云厂商支持 .js .css 缓存30天,.html 缓存1小时,.php 不缓存。
- 优点:零代码,运维同学5分钟搞定,适合中小站点。
- 缺点:规则数量有限制(通常50~200条),无法做复杂逻辑判断(如根据Cookie区分移动端/PC端),且变更生效有分钟级延迟。
边缘计算/自定义脚本(高级型)
通过CDN提供的边缘计算(如Cloudflare Workers、CloudFront Functions、阿里云EdgeScript)编写一段代码,在请求到达CDN节点时动态判断后缀并设置缓存策略。
if (request.url.endsWith('.json')) {
if (request.headers.get('X-Api-Version') === 'v2') {
return { ttl: 60 };
}
return { ttl: 300 };
}
- 优点:灵活度极高,可结合request header、Cookie、甚至外部API动态决定缓存行为。
- 缺点:需要写代码,调试门槛高,存在性能开销(每次请求执行脚本),且各家边缘计算语法不兼容。
源站响应头控制(标准型)
最常见也最“正确”的做法——源站服务器返回HTTP响应头(Cache-Control: max-age=3600)控制TTL,CDN直接遵守。
- 优点:由业务后端决定缓存策略,逻辑统一,且符合HTTP缓存规范,CDN只需透传。
- 缺点:需要开发修改后端代码,如果源站没有响应头,则CDN无法知道该缓存多久,还得靠控制台兜底。
适用场景分析:什么时候该用后缀缓存?
场景1:纯静态资源(图片、字体、音视频)
这些文件几乎不变,用后缀缓存设一个超长的TTL(如30天),并配合版本号URL(如 style-v2.css)强制更新,注意:不要对 .png 和 .webp 使用同一规则,因为 .webp 是未来趋势,建议单独设更长的缓存时间以促进浏览器使用。
场景2:半动态页面(如新闻列表页、博客文章页)
假设URL是 /article/123.html可能每10分钟更新一次,这时后缀 .html 无法区分具体页面,解决方案是:在CDN控制台对 .html 设一个较短的TTL(如5分钟),或者利用边缘计算结合URL路径判断(如 /article/* 的HTML缓存5分钟,首页HTML缓存1分钟)。
场景3:API接口(.json、.xml、.proto)
很多API返回的数据是幂等的(如用户头像信息),可以缓存几秒到几十秒,但如果接口含有用户私密数据(如 /user/me.json),绝对不能缓存,这时后缀 .json 不适用,需要结合路径或Cookie隔离,一个常见的坑是:对整个 .json 后缀设了缓存,结果用户A看到用户B的数据——妥妥的隐私泄露。
场景4:伪静态页面(如WordPress等CMS)
CMS通常会将动态URL伪装成 .html 以利于SEO,但实际内容由PHP动态生成,可能每次请求都有细微差异(比如广告随机),直接缓存所有 .html 会导致页面内容错乱,解决方法:要么放弃后缀缓存,改用目录缓存(如 /news/*),要么在边缘计算中检查URL是否包含 参数或特定的cookie。
选型建议:怎么落地最稳妥?
如果你是初创团队或中小站,建议优先使用控制台的后缀规则,配合源站响应头。
- 对
.jpg/png/gif/ico/webp设30天 - 对
.js/css/woff2设7天 - 对
.html设5分钟 - 对
.php/asp/jsp一律不缓存(或协商缓存) - 对
.json/xml设0秒(即不缓存),防止隐私泄露(除非你能100%确认接口无用户数据)
如果业务复杂度上升,比如需要为不同语言( .en.html vs .cn.html)设置不同的缓存策略,或者需要根据用户设备类型( .mobile.html 更短缓存)等,那就必须引入边缘计算,但不要一上来就全量写代码,先做A/B测试,观察边缘计算的延迟(一般增加2~5ms)是否可接受,别忘了给边缘计算脚本设置超时限制,避免死循环拖垮节点。
无论选哪种方案,一定要设置合理的“覆盖”优先级,例如CDN控制台的规则A说“所有 .jpg 缓存30天”,但源站返回的 Cache-Control 说“no-cache”,那最终听谁的?不同厂商逻辑不同,常见策略是:源站响应头优先级高于控制台规则(更符合HTTP规范),所以最安全的做法是:源站决定一切,CDN规则只做兜底和覆盖异常情况。
后缀缓存看似简单,实则是CDN世界里最基础的“分而治之”思想,它把千千万万的资源按类型归类,让每个文件都获得最合适的加速待遇,但别忘了,后缀只是文件的“衣服”,真正的业务逻辑藏在URL的路径、参数和请求头里,下一次调优时,不妨先问问自己:我是在匹配后缀,还是在匹配真实的资源更新规律?用好这把精准制导武器,你的加速效果至少能再提升30%。
发表评论