Apache静态资源缓存必须手动启用mod_expires和mod_headers模块,在VirtualHost内配置ExpiresActive及ExpiresByType规则,并补充Cache-Control响应头,最后通过DevTools验证响应头是否真实发出且状态码变为304。

Apache 静态资源过期时间不能靠 .htaccess 或 php.ini 自动生效,必须手动启用缓存模块、在虚拟主机配置中写明规则,并验证响应头是否真实发出——否则浏览器根本不会缓存。
确认并启用 mod_expires 和 mod_headers 模块
phpEnv 默认不加载这两个模块,即使配置文件里有相关行,也可能被注释或路径错误。
- 打开 Apache24\conf\httpd.conf,搜索
mod_expires和mod_headers - 确保这两行未被
#注释:LoadModule expires_module modules/mod_expires.soLoadModule headers_module modules/mod_headers.so - 检查
modules/目录下是否存在对应文件(如 Windows 下实际路径可能是Apache24\modules\mod_expires.so) - 进入
Apache24\bin\执行httpd.exe -t验证语法;若报Invalid command 'ExpiresActive',说明模块未加载成功
在虚拟主机中配置 Expires 规则
规则必须写在 <VirtualHost> 内,且包裹在 <IfModule mod_expires.c> 中,否则可能静默失效或启动失败。
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 先开启开关:
ExpiresActive on - 对带哈希的 JS/CSS(如
app.a1b2c3.js)用access基准:ExpiresByType application/javascript "access plus 1 year" - 对无版本号的
style.css,改用modification基准(需 Apache 能读取文件修改时间):ExpiresByType text/css "modification plus 2 hours" - 避免用
now plus X:它每次请求都重新计算服务器当前时间,无法形成稳定缓存
补充 Cache-Control 头更可靠
仅靠 Expires 不够,现代浏览器更依赖 Cache-Control。需配合 mod_headers 使用:
- 为哈希文件加不可变标识:
Header set Cache-Control "public, immutable" - 为图片、字体等统一设 max-age:
<FilesMatch "\.(jpg|png|gif|woff2|ttf)$"><br> Header set Cache-Control "max-age=31536000, public"<br></FilesMatch>
- HTML 文件建议禁用缓存:
<FilesMatch "\.html$"><br> Header set Cache-Control "no-cache, no-store, must-revalidate"<br></FilesMatch>
验证缓存是否真正生效
改完配置后重启 Apache,但关键不是“配了”,而是“发出去了”。
- 用 Chrome DevTools 的 Network 标签页,点开某个 JS 或 CSS 文件,查看响应头是否含
Expires或Cache-Control - 首次访问状态码应为
200,后续刷新应变为304(说明浏览器用了缓存并做了条件请求) - 如果响应头完全缺失,常见原因包括:模块未启用、
<IfModule>条件不满足、规则写在了错误位置(如主配置而非虚拟主机内)、或被其他配置覆盖

















