对于静态资源版本控制场景,建议在 Cloudflare 缓存规则中将查询字符串设置为忽略,但需严格避开动态内容路径。
先说结论:该配置适合静态资源版本化管理,能显著提升缓存命中率,但错误配置会导致动态业务数据错乱
- 适合:图片、CSS、JS 等带版本参数的静态文件
- 先准备:确认业务是否存在依赖查询字符串的动态内容(如搜索、API)
- 验收:通过不同查询字符串访问同一资源,确认返回内容一致且命中缓存
快速处理思路
登录 Cloudflare Dashboard,进入 Caching 页面。若需全局调整,在 Configuration 中修改 Caching level 为 Ignore Query String(仅对部分静态扩展名生效);若需精细控制,建议使用 Cache Rules 创建规则,针对特定路径设置 Cache Key 的 Query String 为 Ignore。
为什么会这样
Cloudflare 默认将完整 URL 包括查询字符串作为缓存键。当静态资源带有版本参数(如 style.css?v=1)时,每次修改参数都会生成新缓存键,导致旧缓存失效。忽略查询字符串后,相同路径的不同参数请求会命中同一缓存文件,减少回源请求。
分步处理
1. 登录 Cloudflare 控制台,选择对应域名。
2. 左侧菜单选择 Caching > Cache Rules,点击 Create rule。
3. 设置匹配条件(When incoming requests match):例如 Hostname contains "example.com" 或 URI Path 匹配静态资源目录(如 ends with .css 或 starts with /static/)。
4. 在 Then 部分,Cache eligibility 选择 Eligible for cache。
5. 点击 Edit expression 或找到 Cache key 设置区域。
6. 在 Query string 选项中,选择 Ignore query string。注意此处会将所有查询参数排除在缓存键之外。
7. 保存并部署规则(Deploy)。
怎么验证是否生效
使用命令行工具 curl 查看响应头,确认缓存状态。分别执行以下命令:
curl -I -H "Cache-Control: no-cache" "https://example.com/style.css?v=1"
curl -I "https://example.com/style.css?v=2"检查响应头中 cf-cache-status 是否为 HIT。第二次请求即使参数不同,若配置生效且缓存已建立,应直接命中缓存。
常见坑
1. 动态内容误缓存:搜索页或 API 接口若依赖查询字符串返回不同数据,忽略参数会导致用户看到错误内容。务必在匹配条件中排除动态路径。
2. 全局限制:全局 Caching level 的 Ignore Query String 通常仅针对静态文件扩展名生效,非静态扩展名可能不生效,推荐用 Cache Rules。
3. 免费版限制:若使用 Page Rules 实现,免费版仅支持 3 条规则,需谨慎分配;Cache Rules 在免费版中也有数量限制,请合理规划。
参考来源
- Cloudflare 官方文档:Caching levels
- Cloudflare 官方文档:Cache keys
- Cloudflare 官方文档:Cache Rules