如何让Cloudflare遵循DigitalOcean平台FastAPI应用的Cache-Control指令?
FastAPI + Cloudflare 缓存异常问题解决方案
1. 配置Cloudflare遵循缓存指令的方法
- 进入Cloudflare控制台对应域名的缓存→缓存规则,创建新规则:
- 匹配条件设为「所有请求」,缓存行为选择「遵循源站的 Cache-Control 头」(部分版本显示为「尊重 origin 缓存指令」)
- 删除或禁用所有强制缓存的页面规则/缓存规则(比如设置了「缓存级别: 忽略查询字符串」「强制缓存所有GET请求」的规则)
- 关闭「自动缓存静态资源」中的强制缓存选项,或调整为仅缓存源站明确允许的资源
- 注意:Cloudflare开发模式默认3小时后自动失效,测试时需确认其处于激活状态
2. 特定端点/参数绕过Cloudflare缓存的方案
- 路径匹配绕过:创建缓存规则,匹配特定路径(如
/api/fresh-data/*或精确端点/api/user/profile),缓存行为设为「不缓存」(Bypass cache) - 请求头匹配绕过:创建规则,匹配请求头包含
Cache-Control: no-cache或Cache-Control: no-store,缓存行为设为「不缓存」 - 查询参数匹配绕过:针对带
?refresh=1这类参数的请求,创建规则匹配查询参数refresh存在,缓存行为设为「不缓存」 - FastAPI端配合:在需要绕过缓存的端点中返回
Cache-Control: no-store, must-revalidate响应头,确保Cloudflare能识别(前提是已配置遵循源站指令)
3. 生产环境x-fastapi-cache始终显示MISS的原因
- Cloudflare直接返回了自身缓存的响应,请求根本没到达FastAPI应用,导致应用级缓存(fastapi-cache2)完全没被调用,自然返回MISS
- Cloudflare缓存规则优先级高于源站指令,比如存在强制缓存所有GET请求的规则,覆盖了源站返回的Cache-Control头
- 检查响应头
CF-Cache-Status:如果是HIT,说明Cloudflare直接返回缓存;如果是MISS但x-fastapi-cache仍为MISS,需排查生产环境Redis连接是否正常、缓存键生成逻辑是否和本地一致(比如是否遗漏了查询参数、用户头信息等) - Cloudflare可能修改了请求头,导致应用生成的缓存键与预期不符,无法命中已存在的缓存
最终需求实现(Cloudflare收到no-cache时绕过缓存)
- 新增Cloudflare缓存规则:匹配请求头
Cache-Control: no-cache,缓存行为设为「不缓存」 - 确保Cloudflare全局遵循源站Cache-Control指令,让应用返回的缓存策略生效
- 验证FastAPI生产环境的Redis连接正常,缓存键生成逻辑与本地一致
- 测试时用
curl -H "Cache-Control: no-cache" https://your-domain.com/api/xxx,查看CF-Cache-Status为MISS,同时x-fastapi-cache能正常显示HIT/MISS
内容的提问来源于stack exchange,提问作者JJ Fantini
相关产品推荐
相关产品推荐

