必须先启用mod_expires和mod_headers模块,在virtualhost内用expiresactive on和expiresbytype设规则,并补充header set cache-control头;否则响应头缺失,浏览器无法缓存。

Apache 要让浏览器真正开始本地缓存,不是写几行规则就行——得先确保模块启用、规则位置正确、时间基准合理,再补上现代浏览器更认的 Cache-Control 头。否则配置写了也白写,响应头根本不出现在 Network 面板里。
确认并启用两个核心模块
mod_expires 和 mod_headers 必须都启用,缺一不可:
- 打开
httpd.conf(或apache2.conf),检查这两行没被#注释:LoadModule expires_module modules/mod_expires.soLoadModule headers_module modules/mod_headers.so - Windows 下用
httpd.exe -t,Linux/macOS 用apachectl -t验证语法;若报Invalid command 'ExpiresActive',说明mod_expires没加载成功 - Debian/Ubuntu 可直接运行
a2enmod expires headers,然后重启 Apache
在虚拟主机内配置过期规则
规则必须写在 <virtualhost></virtualhost> 块里,且包裹在 <ifmodule mod_expires.c></ifmodule> 中,.htaccess 或全局配置顶部写通常无效:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 开启缓存:
ExpiresActive On - 按 MIME 类型设置(推荐):
ExpiresByType text/css "access plus 1 year"ExpiresByType application/javascript "access plus 1 year"ExpiresByType image/png "access plus 2 weeks" - 兜底规则(对未匹配类型的资源):
ExpiresDefault "access plus 1 day" - 避免用
now plus X—— 每次请求都重算服务器当前时间,缓存无法稳定生效
补充 Cache-Control 响应头才真正可靠
现代浏览器优先信任 Cache-Control: max-age=,Expires 只是 HTTP/1.0 兼容字段。两者不一致时,以 Cache-Control 为准:
- 在同一个
<virtualhost></virtualhost>里加:<ifmodule mod_headers.c></ifmodule>
Header set Cache-Control "public, max-age=31536000" - 对带哈希名的静态资源(如
app.a1b2c3.js),可加immutable防止强制刷新误失效:Header set Cache-Control "public, immutable, max-age=31536000" - HTML、PHP 等动态页面建议禁用缓存:
<filesmatch></filesmatch>
Header set Cache-Control "no-cache, no-store, must-revalidate"
验证是否真实生效
重启 Apache 后,别只看配置文件——要查浏览器实际收到的响应头:
- 打开 Chrome DevTools → Network 标签页,刷新页面,点开一个 JS 或 CSS 文件
- 查看 Response Headers 是否包含:
Expires: Sun, 19 Jul 2027 18:22:00 GMTCache-Control: public, max-age=31536000 - 首次访问状态码是
200,再次刷新变成304(Not Modified),说明浏览器用了本地缓存并发起条件请求,缓存已起效 - 如果响应头完全缺失,常见原因就是模块未启、规则不在
<virtualhost></virtualhost>内、或被其他配置覆盖










