缓存基础

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 适中缓存

缓存清除策略

何时需要清除缓存

  1. 部署新版本 — 更新 CSS/JS/HTML 后
  2. 修复错误内容 — 更正了页面中的错误信息
  3. 更换图片 — 替换了产品图片或设计素材
  4. 紧急更新 — 发布了重要公告或价格变动

清除方法

# 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}'

缓存命中率优化

提高命中率的技巧

  1. 一致的 URL — 避免同一资源通过多个 URL 访问(区分 www 和非 www)
  2. 合理的 TTL — 不要设置过短的 TTL,至少 1 小时
  3. 查询字符串参数 — 合理处理查询参数,避免无意义的参数导致缓存失效
  4. 静态资源版本化 — 使用文件名哈希(如 style.a1b2c3.js
  5. 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/*             → 不缓存(个性化数据)