要让浏览器对静态资源做长效强缓存,核心是用mod_expires模块设置足够长且稳定的过期时间,并配合cache-control提升兼容性与控制精度;关键不是“全开缓存”,而是“按类型精准设长、动态内容坚决不缓”。

要让浏览器对静态资源做长效强缓存,核心是用 mod_expires 模块设置足够长且稳定的过期时间,并配合 Cache-Control 提升兼容性与控制精度。关键不是“全开缓存”,而是“按类型精准设长、动态内容坚决不缓”。
启用模块并开启缓存开关
确保 Apache 已加载两个必要模块:
-
mod_expires:用于生成Expires和基础Cache-Control: max-age -
mod_headers(推荐启用):补充设置更灵活的Cache-Control指令,如immutable、public
在 httpd.conf 或虚拟主机配置中确认已启用:
<ifmodule expires_module><br> ExpiresActive On<br></ifmodule>
按 MIME 类型精细设定缓存时长
优先使用 ExpiresByType,它直接关联服务器实际输出的 Content-Type,比扩展名匹配更可靠。典型配置如下:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
<ifmodule mod_expires.c><br> ExpiresActive On<br> ExpiresByType image/jpg "access plus 1 year"<br> ExpiresByType image/jpeg "access plus 1 year"<br> ExpiresByType image/png "access plus 1 year"<br> ExpiresByType image/webp "access plus 1 year"<br> ExpiresByType font/woff2 "access plus 1 year"<br> ExpiresByType text/css "access plus 1 month"<br> ExpiresByType application/javascript "access plus 1 month"<br> ExpiresByType application/wasm "access plus 1 week"<br></ifmodule>
注意:
• access 表示从用户首次请求时刻起算,最常用也最可控
• HTML、JSON、XML、PHP 输出等动态内容不能设长缓存,应避免配置或显式禁用(如 ExpiresByType text/html "access plus 0 seconds")
增强 Cache-Control 头提升实效性
Expires 是 HTTP/1.0 兼容字段,但现代浏览器更依赖 Cache-Control。用 mod_headers 补充设置可覆盖默认行为:
<ifmodule mod_headers.c><br><filesmatch><br> Header set Cache-Control "public, immutable, max-age=31536000"<br></filesmatch><br><filesmatch><br> Header set Cache-Control "public, max-age=2592000"<br></filesmatch><br></ifmodule>
其中:
• immutable 告诉浏览器该资源不会在有效期内变更,跳过条件请求(节省 304 判断)
• public 允许 CDN 和中间代理缓存,对分发效率至关重要
• max-age 值需与 ExpiresByType 时间一致,避免冲突
验证与避坑要点
配置后务必验证响应头是否生效:
- 用
curl -I https://yoursite.com/style.css查看Expires和Cache-Control字段 - 在 Chrome 开发者工具 → Network 标签页中检查具体资源的响应头和 “Size” 列是否显示
from disk cache或from memory cache - 禁止对带版本号或哈希值的文件(如
main.a1b2c3.js)再设短缓存——这类资源本身已解决更新问题,应一律设为 1 年 - 避免滥用
ExpiresDefault,它容易误缓存 HTML 或 API 接口返回,引发内容陈旧问题










