06 · 读懂 Cloudflare 默认缓存行为
从请求资格、文件扩展名、响应头、默认 TTL 和 CF-Cache-Status 判断一个资源为什么命中或绕过缓存。
编辑与核验:橙宝书编辑团队 ·
完成结果
你能在不创建 Cache Rule 的前提下,先判断请求是否具备缓存资格、响应是否允许共享缓存、对象是否已存在于当前数据中心,并用响应头解释 DYNAMIC、BYPASS、MISS 与 HIT。
缓存判断不是一个开关
flowchart TD
A[请求到达 Cloudflare] --> B{主机名是否 Proxied}
B -- 否 --> X[不经过 Cloudflare 缓存]
B -- 是 --> C{请求是否符合缓存资格}
C -- 否 --> D[DYNAMIC 或不进入缓存路径]
C -- 是 --> E{扩展名、规则与响应头是否允许}
E -- 否 --> F[BYPASS 或 DYNAMIC]
E -- 是 --> G{当前数据中心已有新鲜对象}
G -- 否 --> H[MISS 后请求源站]
G -- 是 --> I[HIT 返回缓存对象]默认行为按 URL 的文件扩展名判断常见静态内容,而不是根据响应的 MIME 类型猜测。HTML 与 JSON 默认不缓存;若业务需要缓存它们,必须先处理身份、Cookie 和私有响应,再用窄范围 Cache Rules 明确开启。
默认会遇到的对象
| 类型 | 默认倾向 | 示例 | 说明 |
|---|---|---|---|
| 常见静态扩展名 | 可缓存 | .css、.js、.png、.webp、.woff2 | 仍受方法、状态码和响应头影响 |
| HTML | 不缓存 | /、/pricing | URL 无静态扩展名时通常为 DYNAMIC |
| JSON | 不缓存 | /api/products.json | 即使内容公开,也需显式评估规则与隐私 |
带 Set-Cookie 的响应 | 通常不存储 | 登录、实验分组、会话初始化 | 先确认 Cookie 是否真的需要 |
private、no-store 等响应 | 不进入共享缓存 | 账号页、敏感 API | 不应为了命中率删除隐私语义 |
资格分两次判断
DYNAMIC 通常表示请求到达时就不符合缓存条件,例如默认不缓存的 HTML、绕过规则或 Development Mode。BYPASS 通常表示请求原本可以进入缓存路径,但源站响应头、Cookie 或配置让 Cloudflare 不存储。具体原因仍要结合规则和完整响应头判断。
没有显式缓存头时的默认 Edge TTL
| 响应状态 | 默认 Edge TTL |
|---|---|
| 200、206、301 | 120 分钟 |
| 302、303 | 20 分钟 |
| 404、410 | 3 分钟 |
| 其他状态 | 默认不缓存 |
这张表只描述“资源本来具备缓存资格,但源站没有提供明确缓存头”的默认值。源站的 Cache-Control、Expires、Cache Rules 和套餐能力都可能改变最终结果。
用同一 URL 做可重复验证
选一个无 Cookie 的静态资源
使用生产页面实际引用的指纹资源,例如 /assets/app.a1b2c3.js。不要用首页作为第一次缓存测试,也不要附带登录 Cookie。
连续请求并保留完整响应头
curl -sS -D first.headers -o /dev/null \
https://www.example.com/assets/app.a1b2c3.js
curl -sS -D second.headers -o /dev/null \
https://www.example.com/assets/app.a1b2c3.js对比 CF-Cache-Status、Age、Cache-Control、Expires、Set-Cookie、Vary、状态码和 CF-Ray。相同 URL 在不同 Cloudflare 数据中心首次访问仍可能是 MISS,因此保留 Ray ID 的机房后缀。
用响应头解释状态
常见序列是首次 MISS、随后同一缓存位置 HIT,且 Age 增长。DYNAMIC 时先确认扩展名与 Cache Rules;BYPASS 时优先看响应的 Set-Cookie 和缓存控制头;不要一看到未命中就清缓存。
再测试动态页面
curl -sS -D - -o /dev/null https://www.example.com/account账号页保持 DYNAMIC 或 BYPASS 往往是正确结果。缓存优化的目标是正确性、源站负载和延迟的平衡,不是让每个 URL 都变成 HIT。
常见状态速查
| 状态 | 读法 | 下一步 |
|---|---|---|
HIT | 当前缓存位置已有可用对象 | 检查 Age、内容版本和缓存键 |
MISS | 请求可缓存,但当前没有对象 | 再请求一次并检查是否被存储 |
DYNAMIC | 请求阶段未进入正常缓存资格 | 查扩展名、方法、规则和 Development Mode |
BYPASS | 响应或配置要求绕过存储 | 查 Cache-Control、Expires、Set-Cookie |
EXPIRED | 找到对象但已过期 | 查 TTL 与重新验证结果 |
REVALIDATED | 过期对象经源站确认仍有效 | 查 ETag 或 Last-Modified |
UPDATING | 正在异步更新,暂时提供旧对象 | 查 stale-while-revalidate 策略 |
需要更细的状态诊断时,进入 CF-Cache-Status 排障手册。下一阶段将用 Cache Rules为真实应用建立安全规则。
官方来源
这篇内容帮你完成目标了吗?
内测反馈只在当前浏览器生成,不会自动上传。