Apache静态资源缓存核心是精准控制不同资源的缓存行为:必须同时启用mod_expires和mod_headers模块,用ExpiresByType按MIME类型设过期时间(如图片1年、CSS/JS1个月),禁用HTML等动态内容缓存,并用mod_headers补充Cache-Control与immutable头,最后通过curl或DevTools验证响应头。
apache 静态资源缓存的核心是让浏览器“少发请求、多用本地副本”,关键不在开一个开关,而在于精准控制不同资源的缓存行为,并与现代 http 缓存机制对齐。
确认并启用必要模块
必须同时启用 mod_expires 和 mod_headers,缺一不可:
-
mod_expires负责生成Expires头和基础max-age -
mod_headers用于设置更灵活、更现代的Cache-Control(比如immutable)
检查是否已加载:apachectl -M | grep -E 'expires|headers'
看到 expires_module (shared) 和 headers_module (shared) 即表示就绪。
若未启用:
- 在主配置文件(
/etc/apache2/apache2.conf或/etc/httpd/conf/httpd.conf)中取消以下两行注释:LoadModule expires_module modules/mod_expires.soLoadModule headers_module modules/mod_headers.so - Debian/Ubuntu 系统可直接运行:
a2enmod expires headers - 重启服务:
systemctl restart apache2(或httpd)
按 MIME 类型设置缓存时长(不依赖文件后缀)
用 ExpiresByType 比 FilesMatch 更可靠——它依据响应头中的 Content-Type 判断,不受 URL 重写、CDN 或 MIME 配置偏差影响。
在虚拟主机配置或 .htaccess 中添加:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
<IfModule mod_expires.c> ExpiresActive On # 图片类:1 年 ExpiresByType image/jpeg "access plus 1 year" ExpiresByType image/png "access plus 1 year" ExpiresByType image/webp "access plus 1 year" ExpiresByType image/x-icon "access plus 1 year" # CSS / JS:1 个月;若带哈希(如 app.abc123.js),可设为 1 年 ExpiresByType text/css "access plus 1 month" ExpiresByType application/javascript "access plus 1 month" # 字体与 WASM ExpiresByType font/woff2 "access plus 1 year" ExpiresByType application/wasm "access plus 1 week" # 显式禁用动态内容缓存 ExpiresByType text/html "access plus 0 seconds" ExpiresByType application/json "access plus 0 seconds" ExpiresByType application/xml "access plus 0 seconds" # 兜底:未匹配类型一律不缓存 ExpiresDefault "access plus 0 seconds" </IfModule>
补充 Cache-Control 与 immutable 头
Cache-Control 是比 Expires 更优先、更精细的控制机制。配合 mod_headers 添加:
<IfModule mod_headers.c> # 所有静态资源加 public + max-age + immutable(适用于带哈希名的文件) <FilesMatch "\.(jpg|jpeg|png|webp|gif|css|js|woff2|ttf|eot)$"> Header set Cache-Control "public, max-age=31536000, immutable" </FilesMatch> # HTML 等动态内容明确禁止缓存 <FilesMatch "\.(html|htm|php|xml|json)$"> Header set Cache-Control "no-cache, must-revalidate, max-age=0" </FilesMatch> </IfModule>
注意:immutable 告诉浏览器“该资源不会变”,可跳过条件请求(如 If-None-Match),进一步减少往返。
验证缓存是否生效
别只看配置是否写对,要确认真实响应头:
- 用
curl -I https://yoursite.com/style.css查看返回头中是否有Expires、Cache-Control - 在 Chrome DevTools 的 Network 标签页中刷新资源,观察 Size 列是否显示
from disk cache或from memory cache - 检查
200 OK响应是否带ETag或Last-Modified(用于后续协商缓存)
CDN 也会读取这些响应头,所以配置正确后,不仅浏览器快,回源请求也会大幅下降。

















