本文概述了在带有二级目录结构的网站上启用CDN时,常见造成资源混淆或缓存污染的根因与实操解决方案,包括域名与路径规划、缓存键配置、响应头设置、版本化与清理策略,以及上线前后验证与回滚方法,目标是在不影响用户体验的前提下安全部署CDN。
许多网站使用 二级目录 管理不同站点或语言版本(如 /app、/blog)。如果CDN按主机名或默认缓存键缓存资源,且未包含路径、查询或自定义标识,就会导致不同路径的资源被错误匹配,产生缓存冲突。另外,Cookie、Vary头或相同文件名(如 /app/style.css 与 /blog/style.css)也会加剧问题。

最佳实践是为不同业务或二级目录使用独立的CDN子域(例如 app.cdn.example.com、blog.cdn.example.com),或至少对缓存键按路径区分。如果无法独立域名,则要在CDN配置中启用“包含路径”或自定义缓存键,确保缓存条目与请求路径一一对应。
设置合理的响应头是关键:静态资源使用 Cache-Control: public, max-age=31536000, immutable 配合文件名版本化;动态或易变资源使用短TTL或 no-cache。避免为静态文件返回 Set-Cookie。必要时使用 Surrogate-Control 或自定义头(如 X-Asset-Version)并将其加入CDN缓存键。
文件名版本化(例如 style.v1.2.3.css)是最可靠的做法,适用于JS、CSS、图片等静态资源。对于二级目录共用同名资源的情况,必须在构建管线中加入版本号或哈希,以避免不同目录之间互相污染缓存。
在CDN控制台启用按路径、查询或自定义头部的缓存键字段。利用“缓存键排除Cookie”和“忽略无关查询参数”功能,结合“按Host+Path”策略。高级CDN支持使用正则或边缘脚本(Edge Workers)来动态生成唯一缓存键,应在上线前于预生产验证。
遇到冲突先从CDN层面清理:按路径或使用 surrogate-keys 批量清除缓存,避免全域Purge。若问题严重,临时回滚可以恢复原域名直连源站或禁用新规则。并在修复后逐步切换,观察日志与错误率。
上线前应在预发布环境复刻二级目录结构,验证缓存键、头部、版本化和跨路径访问。上线后监控命中率、404/200比例、资源大小和用户报错。启用CDN访问日志与应用端追踪,快速定位是否为缓存命中错误导致的内容错配。
将版本号、CDN主机配置和缓存头由CI/CD管理,构建时生成带哈希的文件名并自动注入资源URL。将CDN规则、缓存键配置纳入基础设施即代码(IaC)或配置脚本,减少手工操作带来的不一致性。