Apache中Directory指令本身不发缓存头,但通过包裹静态资源目录并配合mod_expires(ExpiresByType设长过期)和mod_headers(Cache-Control+immutable),可统一启用强缓存,显著减少请求数与传输量。

在 Apache 中,Directory 指令本身不直接发送缓存头,但它能精准控制某类静态资源所在目录的响应行为。配合 mod_expires 和 mod_headers,就能为整个目录下的文件统一注入强缓存策略,让浏览器长期复用本地副本,显著减少请求数和传输量。
明确静态资源存放路径并用 Directory 包裹
把 CSS、JS、图片等前端静态文件集中放在独立子目录(如 /static/ 或 /assets/),再用 <directory></directory> 显式声明该路径,避免规则被全局配置覆盖或误用于动态内容。
- 推荐结构示例:
/var/www/example.com/static/css/app.css、/static/js/main.a1b2c3.js - 对应配置:
<Directory "/var/www/example.com/static"> Require all granted Options -Indexes -FollowSymLinks AllowOverride None </Directory> - 关键点:禁用
AllowOverride可跳过 .htaccess 扫描;关闭Indexes防止目录列表暴露;-FollowSymLinks减少符号链接检查开销
在 Directory 内启用 expires 并按 MIME 类型设长过期
缓存时间不能靠文件后缀判断(如 .js 可能是动态生成),必须依据响应头中的 Content-Type。在 <directory></directory> 块内启用 ExpiresActive On,再用 ExpiresByType 精准匹配。
- 典型配置:
<Directory "/var/www/example.com/static"> ... <IfModule mod_expires.c> ExpiresActive On ExpiresByType text/css "access plus 1 year" ExpiresByType application/javascript "access plus 1 year" ExpiresByType image/jpeg "access plus 1 year" ExpiresByType image/png "access plus 1 year" ExpiresByType image/webp "access plus 1 year" ExpiresByType image/x-icon "access plus 1 year" ExpiresByType font/woff2 "access plus 1 year" ExpiresDefault "access plus 0 seconds" </IfModule> </Directory> - 说明:“1 year”适用于带哈希命名的资源(如
main.a1b2c3.js);ExpiresDefault "0 seconds"是兜底项,防漏配导致意外缓存
用 headers 模块补充 Cache-Control 与 immutable
仅靠 Expires 头已不够,现代浏览器更依赖 Cache-Control。在同一个 <directory></directory> 块中,用 <ifmodule mod_headers.c></ifmodule> 补充完整指令,尤其对哈希资源加 immutable 可彻底禁用条件请求。
立即学习“前端免费学习笔记(深入)”;
- 添加如下配置:
<IfModule mod_headers.c> <FilesMatch "\.(css|js|png|jpg|jpeg|gif|webp|ico|woff2)$"> Header set Cache-Control "public, max-age=31536000, immutable" </FilesMatch> </IfModule> - 注意:
FilesMatch在此处是合理选择——它基于文件扩展名快速匹配,而这类静态目录里扩展名与 MIME 类型高度一致;immutable能让浏览器跳过If-None-Match/If-Modified-Since请求,真正实现“零往返”复用 - 避免混用
no-cache或private,它们会覆盖前面设置的强缓存效果
验证是否生效与常见避坑点
重启 Apache 后,打开浏览器开发者工具 → Network 标签页,刷新页面,点击任意静态资源(如 app.css),检查响应头是否同时包含:
Expires: [未来时间,如 Wed, 19 Aug 2027 09:56:00 GMT]Cache-Control: public, max-age=31536000, immutable-
Last-Modified或ETag可有可无,但不应出现no-store、must-revalidate等冲突指令
常见问题:若缓存头未出现,先确认 mod_expires 和 mod_headers 已启用(apachectl -M | grep -E "(expires|headers)");再检查 <directory></directory> 路径是否与文件系统真实路径完全一致(含末尾斜杠、大小写);最后确认没有更高优先级的配置(如 .htaccess 或其他 <location></location>)覆盖了该规则。


















