apache启用mod_expires需同时启用mod_expires和mod_headers模块,配置expiresbytype于virtualhost内并用header补全cache-control头,否则浏览器无法生效。
apache启用mod_expires设置浏览器缓存过期时间,关键不是简单加几行配置,而是确保模块加载、规则位置正确、mime类型匹配精准,并补全cache-control头——否则浏览器根本收不到缓存指令。
确认并启用 mod_expires 和 mod_headers 模块
两个模块必须同时启用,缺一不可:
- 运行
apachectl -M | grep -E "(expires|headers)",看到expires_module (shared)和headers_module (shared)才算就绪 - 若未启用:在
httpd.conf(或apache2.conf)中取消这两行的注释:LoadModule expires_module modules/mod_expires.soLoadModule headers_module modules/mod_headers.so - Debian/Ubuntu 系统可直接执行:
a2enmod expires headers && systemctl restart apache2 - 改完后务必用
apachectl -t检查语法,再重启服务
在 VirtualHost 内配置 ExpiresByType 规则
规则必须写在 <virtualhost></virtualhost> 块中,且包裹在 <ifmodule mod_expires.c></ifmodule> 内;写在 .htaccess 或全局配置顶部通常无效:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 先开启缓存开关:
ExpiresActive On - 按真实 MIME 类型设时间,比按文件后缀更可靠(例如 PHP 输出的图片,Content-Type 才是关键):
ExpiresByType image/jpeg "access plus 1 year"ExpiresByType text/css "access plus 1 month"ExpiresByType application/javascript "access plus 1 month"ExpiresByType image/x-icon "access plus 1 year" - 动态内容明确禁用:
ExpiresByType text/html "access plus 0 seconds" - 避免用
now plus X—— 每次请求都重算服务器时间,导致缓存时间不一致
用 mod_headers 补充 Cache-Control 头
现代浏览器优先信任 Cache-Control: max-age=,Expires 只是兼容字段。两者不一致时,以 Cache-Control 为准:
- 在同一个
<virtualhost></virtualhost>中添加:<ifmodule mod_headers.c></ifmodule>
Header set Cache-Control "public, max-age=31536000" - 对带哈希名的静态资源(如
main.a1b2c3.js),建议加immutable防止 F5 强制刷新误失效:Header set Cache-Control "public, immutable, max-age=31536000" - HTML、PHP 等动态页面应显式禁用:
<filesmatch></filesmatch>
Header set Cache-Control "no-cache, no-store, must-revalidate"
验证响应头是否真实生效
别只看配置文件是否保存成功,要确认浏览器实际收到的响应头:
- Chrome 打开 DevTools → Network 标签页 → 刷新页面 → 点开一个 JS 或 CSS 文件
- 检查 Response Headers 是否包含:
Expires: Tue, 14 Sep 2027 22:38:00 GMT(对应 1 年后)Cache-Control: public, immutable, max-age=31536000 - 也可用命令行验证:
curl -I https://yoursite.com/style.css,查看输出头










