Apache mod_expires 是实现浏览器强缓存最直接稳定的方式,通过ExpiresByType按MIME类型设长时效缓存,并用mod_headers补全Cache-Control与immutable语义,需验证响应头一致且避免后端覆盖。

Apache 的 mod_expires 是实现浏览器强缓存最直接、最稳定的方式。对图片(JPEG/PNG/GIF/WEBP/ICO)和样式表(CSS)这类极少变动的静态资源,设置长时效、不可变(immutable)的缓存策略,能显著降低重复请求、提升首屏加载速度,并减轻服务器压力。
启用模块并开启缓存功能
确保 mod_expires 和 mod_headers 已加载——后者用于补充或覆盖 Cache-Control 头,增强控制力:
- 在
httpd.conf或apache2.conf中取消注释:LoadModule expires_module modules/mod_expires.soLoadModule headers_module modules/mod_headers.so - 重启 Apache:
sudo systemctl restart apache2(Debian/Ubuntu)或sudo apachectl graceful(macOS / CentOS) - 在虚拟主机或
.htaccess中启用缓存开关:ExpiresActive On
按 MIME 类型精准设置强缓存时间
使用 ExpiresByType 指令,依据实际响应头中的 Content-Type 设置缓存周期。推荐采用 "access plus N time" 语义,避免依赖文件修改时间(modification),更符合 CDN 和现代部署场景:
ExpiresByType image/jpeg "access plus 1 year"ExpiresByType image/png "access plus 1 year"ExpiresByType image/gif "access plus 1 year"ExpiresByType image/webp "access plus 1 year"ExpiresByType image/x-icon "access plus 1 year"ExpiresByType text/css "access plus 1 month"ExpiresByType application/javascript "access plus 1 month"
注意:不要为 CSS/JS 设置过长(如 1 年),否则版本更新后用户可能因缓存未失效而加载旧代码;1 个月是兼顾稳定性与可控性的常用值。
补全 Cache-Control 头以支持 immutable 语义
Expires 头已逐渐被 Cache-Control 取代,尤其需启用 immutable 标志来防止浏览器在非强制刷新(如 F5)时发起条件请求(If-None-Match)。配合 mod_headers 添加:
- 对图片类资源:
<If "%{CONTENT_TYPE} =~ m#^image/#"><br> Header merge Cache-Control "public, immutable, max-age=31536000"<br></If> - 对 CSS/JS:
<If "%{CONTENT_TYPE} =~ m#^(text/css|application/(x-)?javascript)#"><br> Header merge Cache-Control "public, max-age=2592000"<br></If>
此写法要求 Apache ≥ 2.4 且启用 mod_if_version,比单纯用 <filesmatch></filesmatch> 更准确,不依赖文件扩展名,而是真实响应类型。
验证与调试关键点
配置生效后,务必通过真实请求验证响应头是否符合预期:
- 用
curl -I https://yoursite.com/style.css查看是否含:Cache-Control: public, max-age=2592000Expires: [未来日期] - 在 Chrome DevTools → Network → 点击资源 → Headers → Response Headers 中确认两字段共存且数值一致
- 注意:若后端 PHP/Node 等脚本显式设置了
Cache-Control(如no-cache),会覆盖 Apache 配置,需统一由 Web 服务器层控制 - 首次部署后建议硬刷新(Ctrl+Shift+R)或清空浏览器缓存再测试,避免旧缓存干扰判断


















