apache的缓存控制头(如cache-control和expires)是cdn判断是否缓存及缓存时长的核心依据,cdn严格遵循源站返回的指令;若apache未输出合理、一致的缓存头,cdn将跳过缓存或仅短时缓存,导致命中率低下。

Apache 的缓存控制头(如 Cache-Control 和 Expires)是 CDN 判断是否缓存、缓存多久的核心依据。CDN 本身不生成这些头,而是严格遵循源站(即 Apache)返回的指令。如果 Apache 没有输出合理、一致、可预测的缓存头,CDN 很可能跳过缓存或只缓存极短时间,导致命中率低下。
关键点不是“Apache 做了什么”,而是“Apache 让 CDN 看到了什么”。
明确静态与动态资源的缓存策略
Apache 必须对不同资源类型区别对待,避免“一刀切”:
-
长期缓存静态资源(JS/CSS/图片/字体):
- 使用带哈希指纹的文件名(如
main.a1b2c3.js),确保内容变更即 URL 变更; - 对应设置强缓存头:
<filesmatch> Header set Cache-Control "public, max-age=31536000, immutable" ExpiresActive On ExpiresDefault "access plus 1 year" </filesmatch>
-
immutable能防止浏览器在max-age内发起条件请求,减少 CDN 回源验证。
- 使用带哈希指纹的文件名(如
-
短期缓存 HTML 或个性化页面:
- 避免直接缓存
/index.html这类页面,除非已做静态化或边缘渲染; - 可设为
Cache-Control: public, max-age=3600,并配合Vary: Cookie(慎用,易分裂缓存); - 更推荐用
no-cache+ETag,让 CDN 执行协商缓存(304)而非全量回源。
- 避免直接缓存
-
禁止缓存敏感或动态接口:
<location> Header set Cache-Control "no-store, no-cache" </location>
统一响应头,消除缓存键分裂
CDN 缓存键(Cache Key)通常默认包含:协议 + 域名 + 路径 + 查询参数 + Vary 头声明的字段。任何差异都会导致同一资源被存多份。
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
-
精简并固定
Vary头:- 默认不要加
Vary: User-Agent(移动端/PC 端各存一份); - 若需压缩,只保留
Vary: Accept-Encoding,并确保后端始终返回gzip或br; - 移除不必要的
Vary字段(如Vary: Origin仅在 CORS 场景必需)。
- 默认不要加
-
标准化响应头输出:
- 确保所有路径下同类型资源返回完全一致的
Content-Type和Cache-Control; - 避免某些请求返回
Cache-Control: private(比如登录态泄漏导致),可用SetEnvIf条件控制:SetEnvIf Request_URI "^/static/" is_static Header set Cache-Control "public, max-age=31536000" env=is_static
- 确保所有路径下同类型资源返回完全一致的
配合日志分析,验证并迭代策略
Apache 默认 access_log 不含缓存相关头,需主动记录才能定位问题:
-
在
httpd.conf或虚拟主机中启用扩展字段:LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %{Cache-Control}o %{Vary}o %D" cdn_debug CustomLog /var/log/apache2/cdn_access.log cdn_debug -
查看日志中典型低效模式:
- 大量
200响应但Cache-Control为空 → 后端未输出缓存头,需补全; - 同一路径反复出现不同
Vary值 → 检查后端逻辑是否动态插入头; -
POST请求命中/static/→ 前端误调用,需修复请求方法; -
X-Cache: MISS高频且响应头含no-cache→ 源站配置冲突,优先修正 Apache 输出。
- 大量
补充实践要点
-
禁用干扰性头:
Pragma: no-cache、Expires: Thu, 01 Jan 1970 00:00:00 GMT这类旧式头会覆盖Cache-Control,务必清理; -
避免查询参数污染缓存键:对
/img/logo.png?v=1.2.3这类带版本号的 URL,可在 CDN 层配置“忽略查询参数”,或在 Apache 中重写为/img/logo.v1.2.3.png; -
启用压缩但不影响缓存:
mod_deflate压缩后仍保持原始Content-Type和Cache-Control,CDN 可正常缓存压缩后响应; - HTTPS 下注意 HSTS 与缓存无关:HSTS 控制重定向行为,不参与缓存决策,无需特别调整。
不复杂但容易忽略。










