CDN 优化清单
提升命中率
- 缓存键只包含真正影响响应的字段,剔除无关 Query 与 Header
- 静态资源用内容哈希文件名 + 长 max-age,实现永久缓存
- HTML 用短 TTL + stale-while-revalidate,兼顾更新与性能
- 开启 Origin Shield 减少回源次数
- 对 Vary 头保持谨慎,一个不必要的 Vary 能让命中率腰斩
源站保护
- S3 源站用 OAC,禁止直接公网访问桶
- 自定义源站校验 CloudFront 自定义 Header,拒绝绕过 CDN 的直连
- WAF 挂在 CloudFront 层,拦截在边缘而不是源站
- 配置源站故障转移,主源不可用时自动切备源
- 限流规则按 IP 与路径分级设置
性能与体验
- 开启 Brotli 与 Gzip 压缩
- 启用 HTTP/2 与 HTTP/3
- 图片按设备返回 WebP/AVIF,用 CloudFront Functions 做协商
- 关键 API 用 Global Accelerator 走 AWS 骨干网
- 配置实时日志与缓存命中率看板
缓存策略与安全响应头
// CloudFront Functions:在边缘补充安全响应头并做图片格式协商
// 部署在 viewer-response 事件上,执行时间需控制在 1ms 内
function handler(event) {
var response = event.response;
var headers = response.headers;
// 安全响应头,比在应用层加更省事也更统一
headers['strict-transport-security'] = {
value: 'max-age=63072000; includeSubDomains; preload'
};
headers['x-content-type-options'] = { value: 'nosniff' };
headers['x-frame-options'] = { value: 'SAMEORIGIN' };
headers['referrer-policy'] = { value: 'strict-origin-when-cross-origin' };
headers['permissions-policy'] = {
value: 'camera=(), microphone=(), geolocation=(self)'
};
headers['content-security-policy'] = {
value: [
"default-src 'self'",
"script-src 'self'",
"style-src 'self' 'unsafe-inline'",
"img-src 'self' data:",
"font-src 'self' data:",
"connect-src 'self'",
"frame-ancestors 'self'",
"base-uri 'self'",
"form-action 'self'"
].join('; ')
};
// 静态资源标记为可长期缓存(前提是文件名带内容哈希)
var uri = event.request.uri;
if (/\.(css|js|woff2?|svg|png|jpg|webp|avif)$/.test(uri)) {
headers['cache-control'] = { value: 'public, max-age=31536000, immutable' };
} else if (/\.html$/.test(uri) || uri.endsWith('/')) {
headers['cache-control'] = {
value: 'public, max-age=300, stale-while-revalidate=86400'
};
}
return response;
}
CSP 上线前先用 Report-Only 模式跑一周,收集违规报告再收紧,直接上强制模式很容易把页面搞坏。