如何自动刷新Cloudflare缓存以优化GCP API响应速度?
解决Cloudflare中stale-while-revalidate不生效的问题
针对你的场景,要实现缓存过期后返回 stale 内容同时后台异步更新缓存,得从Cloudflare缓存配置、源站响应头两个核心维度排查调整,具体步骤如下:
1. 确保Cloudflare允许缓存你的API路径
Cloudflare默认不会缓存API类请求(尤其是带动态参数或POST方法的),必须通过缓存规则明确开启:
- 登录Cloudflare仪表盘,进入「缓存」->「缓存规则」,新建规则
- 匹配条件设为你的API路径(比如
your-domain.com/api/*) - 缓存行为设置:
- 「缓存状态」选择「缓存」
- 「缓存级别」根据需求选:如果API带查询参数且不同参数返回不同内容,选「包含所有查询字符串」;否则选「忽略查询字符串」
- 若你的API是POST请求(仅适用于幂等场景),需额外勾选「缓存POST请求」
2. 修正源站(GCP API)的Cache-Control响应头
stale-while-revalidate生效的前提是源站返回格式正确且无冲突的响应头:
- 必须包含
public指令(Cloudflare作为共享缓存,不会缓存private标记的内容) - 配合
max-age定义缓存新鲜期,stale-while-revalidate定义允许返回过期内容的时间窗口 - 禁止出现
must-revalidate、no-cache、no-store这类会强制回源的指令
示例正确的响应头:
Cache-Control: public, max-age=3600, stale-while-revalidate=86400
解释:
max-age=3600:缓存新鲜1小时,这段时间直接返回缓存(CF-Cache-Status: HIT)stale-while-revalidate=86400:新鲜期过后的24小时内,Cloudflare优先返回过期缓存(CF-Cache-Status: STALE),同时异步向GCP API拉取最新内容更新缓存
3. 检查Cloudflare全局缓存设置
- 关闭「开发模式」:在「缓存」->「开发模式」确保开关处于关闭状态(开发模式会绕过所有缓存)
- 边缘缓存TTL设置为「尊重源站头」:在「缓存」->「缓存规则」或「默认缓存行为」中,让Cloudflare遵循源站返回的
max-age,不要强行覆盖为固定值
4. 验证生效状态
用curl或浏览器开发者工具查看响应头的CF-Cache-Status字段:
- 首次请求:
CF-Cache-Status: MISS(缓存未命中,回源并存储缓存) - max-age有效期内:
CF-Cache-Status: HIT(直接返回新鲜缓存) - 超过max-age但在stale窗口内:
CF-Cache-Status: STALE(返回过期缓存,后台异步更新)
5. 排查特殊冲突
- 检查GCP API是否返回
ETag或Last-Modified头:这两个头能让Cloudflare在后台验证时,通过304 Not Modified减少回源带宽,提升更新效率 - 检查是否有其他Cloudflare规则(如页面规则)覆盖缓存设置:优先级高的页面规则可能会忽略缓存规则的配置,需调整规则优先级或删除冲突规则
内容的提问来源于stack exchange,提问作者Alexandre Schaffner
相关产品推荐
相关产品推荐

