Cloudflare 缓存规则让您能精细控制内容在 Cloudflare 全球边缘网络(覆盖全球 300 多个节点)的缓存方式。正确配置后,缓存规则确保访客从最近的边缘服务器获取内容,而不是每次请求都回源到您的主机服务器。结果是网站速度可量化地加快、主机方案带宽消耗大幅减少、源服务器负载降低。本指南从基础到高级模式介绍实用的缓存规则配置,包含可直接复制到 Cloudflare 仪表板的现成表达式。
Cloudflare 缓存规则的工作原理
缓存规则是条件指令,告诉 Cloudflare 如何处理符合特定条件的请求:是否缓存响应、缓存多长时间,以及是否将请求直接传递到源服务器而不进行缓存。Cloudflare 按照您定义的顺序从上到下处理规则,遇到第一条匹配规则后停止(除非另有配置)。
当用户请求页面时,流程如下:
- 请求到达最近的 Cloudflare 边缘数据中心。
- Cloudflare 检查是否存在新鲜的缓存副本(缓存命中 HIT)。
- 如果命中,立即返回缓存响应——无需回源请求。
- 如果未命中(MISS),Cloudflare 将请求转发到源服务器,将响应存入缓存,然后返回给用户。
- 在 TTL 窗口内对同一资源的后续请求将全部是 HIT 响应。
构建规则前需要了解的关键概念:
- 缓存命中率(Cache Hit Ratio) — 从缓存提供的请求百分比。越高越好。内容密集型网站目标应达到 80% 以上。
- 边缘 TTL(Edge TTL) — Cloudflare 在再次向源服务器确认前保留缓存副本的时间。
- 浏览器 TTL(Browser TTL) — 访客浏览器保留本地副本的时间。
- CF-Cache-Status 响应头 — 检查每个响应的此响应头,以确认缓存是否按预期工作(HIT、MISS、BYPASS、DYNAMIC、EXPIRED)。
在 Cloudflare 仪表板中访问缓存规则
要创建或管理缓存规则,请进入 Cloudflare 仪表板中的区域,按以下步骤操作:
- 登录 dash.cloudflare.com 并选择您的域名(区域)。
- 点击左侧边栏中的 Caching(缓存)。
- 选择 Cache Rules(缓存规则)。
- 点击 Create rule(创建规则) 添加新规则。
- 给规则一个描述性名称,如"缓存静态资源 - 1 个月"或"绕过 WP 管理后台"。
- 构建匹配表达式并配置缓存行为选项。
- 点击 Deploy(部署) 立即激活规则。
免费计划每个区域支持 10 条缓存规则,已能满足绝大多数网站的需求。规则按列出顺序评估,因此当条件重叠时,规则优先级非常重要。
规则 1:主动缓存所有静态资源
您能创建的单一最高影响力缓存规则,是将所有静态文件类型尽可能长时间地缓存。静态资源——图片、样式表、脚本、字体——几乎不会更改,从 Cloudflare 边缘而非主机服务器提供这些文件,可显著降低带宽消耗并提升全球页面加载速度。
表达式:
(http.request.uri.path.extension in {"jpg" "jpeg" "png" "gif" "webp" "svg" "ico" "css" "js" "woff" "woff2" "ttf" "eot" "mp4" "mp3" "pdf" "zip"})
缓存行为设置:
- 资格:适合缓存(Eligible for cache)
- 边缘 TTL:覆盖源服务器——1 个月(2,592,000 秒)
- 浏览器 TTL:覆盖源服务器——1 个月
设置 1 个月的边缘 TTL 后,Cloudflare 将在 30 天内提供这些文件而无需联系源服务器。如果您部署了 CSS 或 JS 更新,请使用 Cloudflare 的清除缓存功能(自定义清除特定 URL)立即使旧副本失效,而无需等待 TTL 过期。
规则 2:绕过 WordPress 管理后台和已登录用户的缓存
设置 Cloudflare 缓存时最常见的错误之一,是未能排除 WordPress 管理区域和已身份验证的用户会话。缓存这些区域会导致登录失败、用户看到彼此的管理面板以及提交过期表单。在 WordPress 网站上启用任何主动缓存之前,必须先设置此绕过规则。
表达式:
(http.request.uri.path contains "/wp-admin") or (http.request.uri.path contains "/wp-login.php") or (http.request.uri.path contains "/wp-cron.php") or (http.cookie contains "wordpress_logged_in") or (http.cookie contains "wp-settings")
缓存行为:绕过缓存(Bypass cache)
基于 Cookie 的条件至关重要。通过检查 wordpress_logged_in Cookie,Cloudflare 将为任何已登录用户的整个浏览会话绕过缓存——不仅仅是管理面板页面。这可以防止一个用户看到属于另一个已身份验证用户的缓存内容。
WooCommerce 提示:如果您的网站运行 WooCommerce,请用购物车和结账条件扩展绕过规则:(http.request.uri.path contains "/cart") or (http.request.uri.path contains "/checkout") or (http.cookie contains "woocommerce_cart_hash")。缓存购物车或结账页面会导致客户看到过时的购物车状态或在付款时卡住——这是严重影响转化率的问题。
规则 3:以较短 TTL 缓存 HTML 页面
默认情况下,Cloudflare 不缓存 HTML 响应,因为它将其视为潜在的动态内容。对于不常更新的静态博客、文档站点或文章页面,您可以指示 Cloudflare 以较短的 TTL 缓存 HTML,以进一步提高缓存命中率,同时在合理时间内仍能反映更新。
博客/文章页面的表达式:
(http.request.uri.path contains "/blog/") or
(http.request.uri.path contains "/article/") or
(http.request.uri.path matches "^/[a-z-]+-[0-9]{4}\.html$")
缓存行为设置:
- 资格:适合缓存(Eligible for cache)
- 边缘 TTL:覆盖源服务器——4 小时(14,400 秒)
- 浏览器 TTL:覆盖源服务器——30 分钟
4 小时的边缘 TTL 适合每天发布一到两次的博客和新闻网站。如果发布频率更高,请将 TTL 缩短至 30–60 分钟。30 分钟的较短浏览器 TTL 确保隔一段时间返回页面的读者能获得最新内容,而不会在边缘产生完整的缓存未命中。
缓存行为选项比较
| 行为 | 作用 | 最适合 | 带宽影响 |
|---|---|---|---|
| 适合缓存(Eligible for cache) | 将响应标记为可缓存 | 静态文件、文章页面、HTML | 大幅降低 |
| 绕过缓存(Bypass cache) | 永不缓存,始终回源 | 管理后台、登录、购物车、结账、API | 无变化 |
| 忽略缓存控制(Ignore cache-control) | 覆盖源服务器的 Cache-Control 响应头 | 源服务器发送 no-cache 但您想缓存时 | 中等降低 |
| 不存储(No store) | 提供但从不在边缘存储 | 敏感/私密内容 | 无益处 |
规则 4:从缓存键中排除 UTM 参数
一个常被忽视的优化是缓存键配置。默认情况下,Cloudflare 将带有不同查询字符串的 URL 视为独立的缓存条目。这对产品筛选(如 ?color=blue vs ?color=red)是正确的,但对分析跟踪参数(如 utm_source、fbclid 和 gclid)会造成不必要的缓存碎片——这些参数根本不改变页面内容。
在您的缓存规则中,展开 缓存键(Cache Key)部分并配置:
Query string: Exclude specific parameters Parameters to exclude: utm_source, utm_medium, utm_campaign, utm_term, utm_content, utm_id, fbclid, gclid, _ga, _gl
通过此配置,/article?utm_source=newsletter 和 /article 共享同一缓存条目。对于付费流量显著的网站,仅此一项更改就能将缓存命中率提升 15–30 个百分点,并按比例减少源服务器带宽使用量。
在重新验证时提供过期内容(Stale While Revalidating)
感知性能最强大的缓存模式之一是"重新验证时提供过期内容"。启用后,Cloudflare 立即提供缓存副本——即使技术上已过期——同时在后台从源服务器获取新副本。用户在 TTL 过期边界处不会感受到额外延迟,否则偶尔会出现响应缓慢的情况。
在您的缓存规则中通过切换 Serve stale content while revalidating(重新验证时提供过期内容)来启用此功能。您也可以在源服务器层面表达此行为:
Cache-Control: public, max-age=3600, stale-while-revalidate=86400
此响应头告诉 Cloudflare,一旦 1 小时 TTL 过期,它仍可在重新验证的同时继续提供过期副本最长 24 小时(86,400 秒)。结果是用户始终获得快速响应,内容新鲜度在后台优雅降级,而不会造成硬缓存未命中延迟。
在源服务器设置 Cache-Control 响应头
要获得最精确的缓存行为,直接从源服务器设置 Cache-Control 响应头,让 Cloudflare 遵守它们。这种方法将缓存策略保存在代码中而非 Cloudflare 仪表板中,使其更容易进行版本控制并与应用程序变更一起部署。
在 Apache 的 .htaccess 中:
<FilesMatch "\.(jpg|jpeg|png|gif|webp|ico|css|js|woff|woff2)$"> Header set Cache-Control "public, max-age=2592000, immutable" </FilesMatch> <FilesMatch "\.html$"> Header set Cache-Control "public, max-age=3600, stale-while-revalidate=86400" </FilesMatch>
在 PHP 中处理动态页面:
<?php
// Article page — cache for 1 hour, serve stale for 24 hours during revalidation
header('Cache-Control: public, max-age=3600, s-maxage=14400, stale-while-revalidate=86400');
header('Vary: Accept-Encoding');
?>
s-maxage 指令专门为 CDN 等共享缓存覆盖 max-age,允许您设置较长的边缘 TTL(此例中为 4 小时),同时保持较短的浏览器 TTL(1 小时)。
验证缓存是否正常工作
部署缓存规则后,使用 curl 直接检查响应头来验证其行为,不受浏览器干扰:
curl -I https://yoursite.com/images/hero.jpg
在输出中查找 CF-Cache-Status 响应头。预期值及其含义:
HIT— 从 Cloudflare 边缘缓存提供。这是静态资源期望的结果。MISS— 尚未缓存;从源获取但现在将被缓存。BYPASS— 匹配了绕过规则;有意传递到源服务器。DYNAMIC— Cloudflare 判断内容是动态的,未进行缓存。EXPIRED— 已缓存但 TTL 已过期;正在重新验证。REVALIDATED— 过期内容已重新验证并确认仍然新鲜。
如果应该缓存的文件显示 DYNAMIC,请检查您的源服务器是否在响应头中发送 Cache-Control: no-store 或 private——除非您使用"忽略缓存控制"行为,否则这些会覆盖您的缓存规则。
要查看汇总视图,请访问 Cloudflare 仪表板中的 Caching(缓存)> Overview(概览)。缓存命中率图表显示随时间推移从缓存提供的请求百分比,"已节省带宽"指标量化了您的规则保护了多少源带宽。
内容更新后清除缓存
当您发布新内容或部署 CSS/JS 更新时,需要在 TTL 自然过期前使旧缓存副本失效。Cloudflare 提供多种清除选项:
通过仪表板手动清除:导航至 Caching(缓存)> Configuration(配置),点击 Purge Cache(清除缓存),选择"清除全部"(清除所有缓存内容)或"自定义清除"(指定单个 URL)。
通过 API 自动清除——适合 CMS 部署:
curl -X POST \
"https://api.cloudflare.com/client/v4/zones/YOUR_ZONE_ID/purge_cache" \
-H "Authorization: Bearer YOUR_API_TOKEN" \
-H "Content-Type: application/json" \
--data '{"files":["https://yoursite.com/blog/updated-article.html",
"https://yoursite.com/css/main.css"]}'
WordPress 用户可以通过 Cloudflare 官方 WordPress 插件集成自动缓存清除功能,该插件挂钩到文章保存/发布事件,并在每次更新时自动清除相关 URL(以及可选的首页和分类页面)。
常见问题解答
Cloudflare 缓存规则与 Page Rules 有什么区别?
Page Rules 是 Cloudflare 逐渐淘汰的旧系统,免费计划仅支持 3 条规则,使用通配符(*)模式匹配。缓存规则是基于 Cloudflare Ruleset Engine 构建的现代替代方案,支持对 URL 路径、主机名、Cookie 和请求头进行复杂匹配。所有新配置均推荐使用缓存规则,因为它功能更强大且将获得长期支持。
绕过缓存规则会让我的网站变慢吗?
绕过缓存本身不会让网站变慢。它只是意味着匹配的请求直接传递到源服务器,而不是从 Cloudflare 边缘提供。对于需要实时数据的管理面板、登录页面和结账流程,绕过缓存是正确的行为。缓存这些页面可能导致用户看到过期数据或无法完成身份验证流程。
静态资源应设置多长的缓存 TTL?
对于几乎不变的静态资源——图片(.jpg、.png、.webp)、字体(.woff2)以及文件名中包含版本哈希的 CSS/JS 文件——1 个月(2,592,000 秒)到 1 年(31,536,000 秒)的缓存 TTL 是合适的。如果您的 CSS 或 JS 文件名中不包含版本哈希,请使用较短的 TTL(如 1 周),以确保用户在部署后获得最新文件。
免费计划有多少条缓存规则?
Cloudflare 免费计划每个区域支持 10 条缓存规则,对大多数网站来说已足够。Pro 计划支持 25 条,Business 计划支持 50 条。如果您需要更多规则(如大型电商网站),可以考虑升级或通过更宽泛的表达式合并规则,让单条规则覆盖多个 URL 模式。
AsiaGB DirectAdmin 主机 — 功能完备,价格实惠
AsiaGB 主机完整支持 DirectAdmin、PHP 8.3、MySQL 并与 Cloudflare 完美兼容——起步价仅需 500 泰铢/年。
查看主机方案