directory块绑定缓存策略到物理路径,headers模块输出cache-control和expires头;需在对应directory块内用包裹header指令,并按文件类型分层设置缓存策略,配合expiresbytype做兼容保障。

Directory 块是 Apache 中绑定缓存策略到物理路径的核心位置,Headers 模块则负责输出浏览器真正识别的 Cache-Control 和 Expires 响应头。两者必须配合使用——Directory 定义“对谁生效”,Headers 指令定义“怎么缓存”。
把 Headers 指令写进对应的 Directory 块里
不能把 Header set 放在虚拟主机顶层或全局配置里,否则可能误作用于 HTML、PHP 等不该强缓存的资源。正确做法是:找到 DocumentRoot 对应的 <directory></directory> 块,在其中启用并配置:
- 确保该
Directory块已存在且路径与实际静态文件目录一致(如/var/www/html) - 在块内添加
<ifmodule mod_headers.c></ifmodule>包裹所有Header指令,避免模块未启用时报错 - 用
<filesmatch></filesmatch>精准匹配后缀,例如只对.css、.js、.png生效
按资源类型分层设置 Cache-Control
不同文件更新频率不同,缓存策略要区分对待,不能统一设 max-age=31536000:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- CSS/JS 文件(带哈希版本号):
Header set Cache-Control "public, immutable, max-age=31536000" - 图片、字体、SVG:
Header set Cache-Control "public, max-age=31536000"(可加immutable,但非必需) - HTML 页面:
<filesmatch> Header set Cache-Control "no-cache, must-revalidate"</filesmatch> - PHP 或动态接口响应:
Header always set Cache-Control "no-store"(用always防止被覆盖)
配合 mod_expires 做双重保障
虽然现代浏览器优先认 Cache-Control,但保留 Expires 可兼容旧客户端。同样要在同一个 Directory 块中启用:
- 开启
ExpiresActive On - 按 MIME 类型设过期时间,例如:
ExpiresByType text/css "access plus 1 year" - 对 HTML 显式设为立即过期:
ExpiresByType text/html "access plus 0 seconds" - 兜底规则建议设为短时间(如
access plus 1 day),防止漏匹配类型时意外长缓存
验证是否真落到目标文件上
配置完重启 Apache 后,别只看配置是否语法正确,要实测响应头:
- 打开 Chrome DevTools → Network,刷新页面,点开一个
style.css或logo.png - 检查 Response Headers 是否同时出现:
Cache-Control: public, immutable, max-age=31536000和Expires: ... - 再点开一个
index.html,确认它的Cache-Control是no-cache类型,不是从 CSS 规则里继承来的 - 如果没生效,检查
Directory路径是否拼写错误、模块是否启用(a2enmod headers expires)、是否被更高优先级规则覆盖










