apache的documentroot本身不直接配合cdn,而是作为源站起点;cdn缓存生效关键在于apache输出含cache-control: public, max-age=...的响应头,并确保静态资源路径稳定可被抓取。

Apache 的 DocumentRoot 本身不直接“配合”CDN,而是作为源站内容的起点;CDN 缓存是否生效,关键在于 Apache 如何输出符合缓存要求的 HTTP 响应头,以及 CDN 是否能正确识别并缓存这些资源。配置的核心是:让 Apache 给静态资源(如图片、CSS、JS)返回带 Cache-Control: public, max-age=... 的响应,并确保这些资源路径稳定、可被 CDN 抓取。
1. 确保 DocumentRoot 路径清晰且静态资源集中
CDN 加速的对象是可公开访问的静态文件。建议结构如下:
-
DocumentRoot 设为明确目录,例如
/var/www/html,避免嵌套过深或符号链接干扰回源逻辑 - 将所有前端静态资源(
/images/、/css/、/js/)放在 DocumentRoot 下统一子目录中,方便 CDN 配置路径规则(如缓存/images/*) - 不要把敏感文件(如配置、日志、用户上传原始目录)放在 DocumentRoot 内;上传类文件建议存于外部路径,用
Alias映射并单独控制缓存
2. Apache 输出强缓存响应头(必须启用 mod_headers + mod_expires)
仅靠 DocumentRoot 不会生成缓存头。需在 Apache 配置中显式设置:
- 启用模块:
a2enmod headers expires - 在虚拟主机或
<directory></directory>块中添加:
<ifmodule mod_expires.c><br> ExpiresActive On<br> ExpiresByType image/jpg "access plus 1 year"<br> ExpiresByType text/css "access plus 1 month"<br> ExpiresByType application/javascript "access plus 1 month"<br></ifmodule><br><ifmodule mod_headers.c><br><filesmatch><br> Header set Cache-Control "public, max-age=31536000"<br></filesmatch><br></ifmodule>
注意:public 是关键——没有它,CDN 边缘节点通常拒绝缓存;max-age 值要与 CDN 控制台设置一致,避免冲突。
3. CDN 回源时正确识别 Apache 响应
CDN(如简米云、酷番云、Cloudflare)默认根据 Cache-Control 或 Expires 头决定是否缓存及缓存多久。你需要确认:
- 源站 Apache 返回的响应中确实包含上述头(可用
curl -I yourdomain.com/style.css验证) - CDN 后台未强制覆盖缓存策略(例如某些平台默认对
.php不缓存,但对.css自动继承响应头) - CDN 回源 Host 头正确(尤其多站点共用 IP 时),避免 Apache 返回 404 或默认虚拟主机内容
4. 版本化 URL 避免缓存 stale 问题
Apache 本身不改文件名,但你可以通过重写或构建工具实现版本控制,让 CDN 缓存更新更可靠:
- 发布时给静态资源加哈希后缀,如
app.a1b2c3.js,URL 变更即触发新缓存 - 或用查询参数(不推荐长期使用):
style.css?v=20260729,需确认 CDN 配置为忽略参数缓存(多数默认开启) - Apache 可配合
mod_rewrite将带版本号的请求映射到实际文件,保持部署简洁











