缓存基础
CDN 缓存的核心是决定「什么内容可以缓存」和「缓存多久」。
Cache-Control 响应头
# 强缓存 - 浏览器直接使用缓存,不请求服务器
location ~* \.(jpg|png|webp)$ {
add_header Cache-Control "public, max-age=31536000, immutable";
}
# 弱缓存 - 浏览器需要向服务器验证
location ~* \.html$ {
add_header Cache-Control "public, max-age=0, must-revalidate";
}
# 不缓存 - 每次请求都回源
location /admin/ {
add_header Cache-Control "no-cache, no-store, must-revalidate";
}
按文件类型的推荐缓存策略
| 文件类型 | CDN 缓存 TTL | 浏览器缓存 TTL | 策略说明 |
|---|---|---|---|
| HTML | 0-1h | 0-10min | 经常更新,短缓存 |
| CSS/JS(哈希文件名) | 365d | 365d | 文件名变化即新版本 |
| CSS/JS(普通文件名) | 7d | 1d | 适中缓存,版本变化时清除 |
| 图片(JPG/PNG/WebP) | 30-365d | 30-365d | 很少变化,长缓存 |
| 字体文件 | 365d | 365d | 几乎不变 |
| API 响应(GET) | 0-5min | 0 | 动态数据,短缓存或不缓存 |
| PDF/下载文件 | 30d | 30d | 适中缓存 |
缓存清除策略
何时需要清除缓存
- 部署新版本 — 更新 CSS/JS/HTML 后
- 修复错误内容 — 更正了页面中的错误信息
- 更换图片 — 替换了产品图片或设计素材
- 紧急更新 — 发布了重要公告或价格变动
清除方法
# Cloudflare 清除缓存(API)
curl -X POST "https://api.cloudflare.com/client/v4/zones/{zone_id}/purge_cache" \
-H "Authorization: Bearer {api_token}" \
-H "Content-Type: application/json" \
--data '{"files":["https://example.com/css/style.css","https://example.com/page"]}'
# 清除全部缓存
curl -X POST "https://api.cloudflare.com/client/v4/zones/{zone_id}/purge_cache" \
-H "Authorization: Bearer {api_token}" \
-H "Content-Type: application/json" \
--data '{"purge_everything":true}'
缓存命中率优化
提高命中率的技巧
- 一致的 URL — 避免同一资源通过多个 URL 访问(区分 www 和非 www)
- 合理的 TTL — 不要设置过短的 TTL,至少 1 小时
- 查询字符串参数 — 合理处理查询参数,避免无意义的参数导致缓存失效
- 静态资源版本化 — 使用文件名哈希(如
style.a1b2c3.js) - Cookie 无关 — 静态资源响应中不要设置 Cookie
# 忽略查询参数中的 utm_* 和 fbclid
if ($args ~* "(utm_|fbclid|gclid)") {
set $args '';
}
常见场景配置
场景一:WordPress 网站
缓存策略:
- /wp-content/uploads/* → 缓存 30 天
- /wp-includes/*.css,*.js → 缓存 365 天
- /wp-admin/* → 不缓存
- /*.php → 不缓存
- HTML 页面 → 缓存 1 小时
场景二:静态站点(Astro/Hugo/Next.js 导出)
缓存策略:
- /*.html → 缓存 1 小时
- /_next/static/* → 缓存 365 天
- /assets/* → 缓存 365 天
- /images/* → 缓存 30 天
- /fonts/* → 缓存 365 天
场景三:API 服务
缓存策略:
- GET /api/public/* → 缓存 5 分钟
- GET /api/prices → 缓存 1 小时
- POST/PUT/DELETE/* → 不缓存
- GET /api/user/* → 不缓存(个性化数据)