Apache中推荐用mod_headers配置Cache-Control,需先启用模块,再按文件类型设max-age:静态资源1周、CSS/JS 1年加immutable、HTML等仅10分钟,并避免与Expires冲突。
直接用 mod_headers 配置 cache-control 是 apache 中最灵活、最推荐的缓存控制方式,尤其适合虚拟主机环境——无需启用额外模块(如 mod_expires),规则集中、语义清晰、优先级明确。
确认并启用 mod_headers 模块
该模块通常默认编译但未启用。登录服务器执行:
-
sudo a2enmod headers(Debian/Ubuntu)或手动编辑httpd.conf取消注释:LoadModule headers_module modules/mod_headers.so - 重启服务:
sudo systemctl restart apache2(或httpd) - 验证是否生效:
apache2ctl -M | grep headers应输出headers_module (shared)
在虚拟主机配置中按文件类型设置 max-age
在 块内或站点对应的 .htaccess 文件中添加规则。注意:若用 .htaccess,需确保 AllowOverride All 或至少含 FileInfo 权限。
- 静态资源(图片、字体、音视频)缓存 1 周:
<filesmatch><br> Header set Cache-Control "public, max-age=604800"<br></filesmatch>
- CSS/JS 缓存 1 年(适合带版本号或哈希命名的资源):
<filesmatch><br> Header set Cache-Control "public, max-age=31536000, immutable"<br></filesmatch>
注:immutable告诉浏览器该资源不会变更,可跳过条件请求(如If-None-Match),提升复访性能 - HTML、XML、TXT 等常更新内容缓存仅 10 分钟:
<filesmatch><br> Header set Cache-Control "private, max-age=600"<br></filesmatch>
避免与 Expires 头冲突,统一以 Cache-Control 为准
如果同时启用了 mod_expires,它默认只发 Expires 头;而现代浏览器以 Cache-Control: max-age 为最高优先级。两者不一致时,max-age 生效,但冗余头会增加响应体积。
- 建议关闭
mod_expires的自动Expires输出,或显式禁用:ExpiresActive off - 若必须保留
Expires(如兼容极老客户端),可用Header always set强制覆盖,并确保时间值与max-age逻辑一致:Header always set Expires "access plus 1 week" - 检查响应头是否干净:
用curl -I https://yoursite.com/style.css查看是否只含预期的Cache-Control,无冲突的Expires
进阶:动态控制与条件缓存
借助 mod_headers 的表达式能力(Apache ≥ 2.4.7),可实现更精细策略:
- 对未登录用户缓存 HTML,登录后不缓存:
Header set Cache-Control "public, max-age=1800" env=!REDIRECT_HTTP_AUTHORIZATION
(假设登录态通过 Authorization 头识别) - 对调试环境(如开发子域名)禁用缓存:
Header set Cache-Control "no-store, must-revalidate" "expr=%{HTTP_HOST} =~ m/^dev\./" - 为特定路径添加
Vary头,避免 CDN 或代理误缓存:Header append Vary Accept-Encoding(配合 gzip)或Header append Vary User-Agent(慎用)










