Cloudflare 默认策略下 HTML 等动态内容通常不缓存,若出现缓存多因配置了“缓存所有内容”规则。解决核心是在控制台针对特定路径将缓存级别设为“绕过”。
先说结论:动态页面被缓存通常是因为误开了全站缓存规则,需在 Cache Rules 或 Page Rules 中将对应路径的缓存级别改为“Bypass”。
- 适合:后台管理路径、API 接口、用户中心等实时性要求高的动态内容
- 先确认:检查是否开启了 Cache Everything 或全站缓存的页面规则
- 验收:使用 curl 检查响应头 cf-cache-status 是否为 DYNAMIC 或 BYPASS
快速处理思路
Cloudflare 主要通过控制台配置,无需服务器命令。登录 dashboard 后进入 Caching 页面,优先使用 Cache Rules 新建规则,匹配动态路径后设置 Cache Level 为 Bypass。若使用免费版且规则数量受限,可检查是否占用了 Page Rules 名额。
为什么会这样
Cloudflare 默认只缓存特定的静态文件扩展名(如 css、js、图片),HTML 页面通常被视为动态内容直接回源。公开资料中提到,默认缓存策略下,静态文件的边缘缓存时间通常较短,部分场景仅为 2 小时左右。如果动态页面被缓存,通常是因为用户手动创建了 Cache Rules 或 Page Rules,将缓存级别设为了“Cache Everything”,覆盖了默认行为。这会导致源站内容更新后,CDN 节点仍在旧缓存期内,用户看到旧页面。
分步处理
1. 登录 Cloudflare 控制台,选择对应域名。
2. 进入左侧 Caching > Cache Rules(推荐)或 Page Rules。
3. 点击 Create rule,设置匹配条件。例如 Field 选择 URI Path,Operator 选择 Contains,Value 填写动态路径关键词(如 wp-admin、api、user)。
4. 在 Then 设置中,Cache Level 选择 Bypass(绕过缓存)。
5. 保存规则。注意规则优先级,绕过缓存的规则应置于缓存所有内容的规则之上,确保优先匹配。
怎么验证是否生效
使用 curl 命令检查响应头,确认缓存状态:
curl -I https://yourdomain.com/dynamic-path关注返回头中的 cf-cache-status 字段。若设置成功,该字段应显示 DYNAMIC 或 BYPASS,且 cache-control 头部应包含 no-cache 或 private 等指示。若仍显示 HIT,说明规则未匹配或优先级低于其他缓存规则。
也可结合 grep 快速查看关键状态:
curl -I -s https://yourdomain.com/dynamic-path | grep -i cf-cache-status常见坑
1. 规则优先级错误:Cloudflare 按顺序匹配规则,若“缓存所有”规则排在“绕过缓存”规则之前且匹配成功,后者可能不生效。
2. 免费版限制:免费版本 Cloudflare 仅支持 3 条页面规则,若已用于域名跳转等,剩余名额可能不足,建议优先使用 Cache Rules。
3. Cookie 影响:若页面依赖 Cookie 识别用户,使用 Bypass 模式时无需配置 Cache Key,请求会直接回源;若必须缓存动态内容,则需配置 Cache Key 包含 Cookie 以区分用户。
4. 清除缓存:修改规则后,建议手动清除现有缓存,避免旧缓存文件继续生效。