Apache可通过mod_expires和mod_headers模块,基于MIME类型或文件扩展名设置差异化静态资源缓存策略;推荐用ExpiresByType按类型配置,或Apache 2.4+中用动态匹配CONTENT_TYPE;需禁用HTML、JSON等动态内容缓存,并通过curl或开发者工具验证响应头。

Apache可以通过mod_expires和mod_headers模块,结合MIME类型(即Content-Type)为不同静态资源设置差异化的缓存策略。关键在于利用、或指令匹配响应的MIME类型,并针对性地设置Expires头或Cache-Control头。
基于文件扩展名匹配并设置缓存(最常用)
虽然不是直接按MIME类型判断,但实践中文件扩展名与MIME类型强相关,配置简单可靠。Apache在发送响应前已根据AddType或mod_mime规则确定了MIME类型,因此按扩展名设置缓存等效于按典型MIME类型区分。
- 启用
mod_expires和mod_headers:
LoadModule expires_module modules/mod_expires.so
LoadModule headers_module modules/mod_headers.so - 在
VirtualHost或.htaccess中配置:
ExpiresActive On
ExpiresByType image/jpg "access plus 1 year"
ExpiresByType image/jpeg "access plus 1 year"
ExpiresByType image/gif "access plus 1 year"
ExpiresByType image/png "access plus 1 year"
ExpiresByType text/css "access plus 1 month"
ExpiresByType application/javascript "access plus 1 month"
ExpiresByType application/wasm "access plus 1 week"
ExpiresByType font/woff2 "access plus 1 year"
使用指令直接匹配Content-Type(Apache 2.4+)
更精确的方式是通过等表达式,在响应阶段动态判断实际发出的MIME类型。这种方式不依赖扩展名,适合内容协商或动态生成但固定类型的场景。
- 要求Apache ≥ 2.4,且启用
mod_if_version和mod_headers - 示例:对所有图片类型统一设长缓存,同时避免覆盖已有Cache-Control
Header merge Cache-Control "public, immutable, max-age=31536000"
Header merge Cache-Control "public, max-age=2592000"
补充:禁用特定类型缓存(如HTML、API响应)
对于不应被代理或浏览器长期缓存的内容(如动态HTML、JSON接口),需显式设置短时效或禁止存储。
- 匹配常见HTML路径或后缀:
Header set Cache-Control "no-store, must-revalidate, max-age=0"
- 或按实际Content-Type(如服务端返回
Content-Type: application/json):
Header set Cache-Control "no-cache, no-store, must-revalidate"
验证与调试技巧
配置生效后,务必通过浏览器开发者工具或curl -I检查响应头是否符合预期。
- 检查MIME类型是否正确:
curl -I https://yoursite.com/style.css | grep "Content-Type" - 确认缓存头是否写入:
curl -I https://yoursite.com/logo.png | grep -i "cache\|expires" - 注意优先级:多个
Header指令会叠加;Header unset可清除已有头;Header always set确保即使状态码非2xx也生效(如错误页)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










