源码安装Apache需手动编译启用mod_expires模块,再按MIME类型设ExpiresByType策略(如图片1年、CSS/JS1个月)、禁用动态内容缓存,并用mod_headers补充Cache-Control与immutable头,最后验证响应头生效。

源码安装的 Apache 默认不启用 mod_expires,必须手动编译、加载并配置,才能对静态文件实现可靠缓存。关键不是“装上就行”,而是“编译进模块 → 正确加载 → 按 MIME 类型设策略 → 补 Cache-Control → 验证响应头”。
确认并编译 mod_expires 模块
源码安装时,mod_expires 通常已包含在源码树中(位于 modules/metadata/),但默认不编译进主程序。需在 configure 阶段显式启用:
- 进入 Apache 源码目录后,运行:
./configure --enable-expires=shared --enable-headers=shared [其他选项] - 其中
--enable-expires=shared表示以 DSO 方式编译为动态模块(推荐),避免重新编译整个 httpd - 执行
make && sudo make install后,模块文件会生成在modules/mod_expires.so
在 httpd.conf 中加载并启用
编辑你安装路径下的主配置文件(如 /usr/local/apache2/conf/httpd.conf):
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 取消注释或添加模块加载行:
LoadModule expires_module modules/mod_expires.soLoadModule headers_module modules/mod_headers.so(强烈建议同时启用,用于补充现代缓存头) - 在
<directory></directory>块(如 DocumentRoot 对应目录)或虚拟主机内启用缓存开关:<IfModule mod_expires.c><br> ExpiresActive On<br></IfModule>
按 MIME 类型设置精准缓存策略
在同一个 <ifmodule mod_expires.c></ifmodule> 块中,用 ExpiresByType 而非 FilesMatch 或 ExpiresDefault:
- 图片类(长效):
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 image/x-icon "access plus 1 year"
- CSS / JS(带哈希可设 1 年,否则建议 1 个月):
ExpiresByType text/css "access plus 1 month"<br>ExpiresByType application/javascript "access plus 1 month"
- 动态内容必须禁用:
ExpiresByType text/html "access plus 0 seconds"<br>ExpiresByType application/json "access plus 0 seconds"<br>ExpiresDefault "access plus 0 seconds"
用 mod_headers 补全 Cache-Control 语义
仅靠 Expires 头无法触发现代浏览器的强缓存(如跳过条件请求)。需配合 mod_headers 设置完整指令:
- 在
<ifmodule mod_headers.c></ifmodule>块中添加:<FilesMatch "\.(css|js)$"><br> Header set Cache-Control "public, max-age=2592000, immutable"<br></FilesMatch><br><FilesMatch "\.(png|jpg|webp|ico|woff2)$"><br> Header set Cache-Control "public, max-age=31536000"<br></FilesMatch>
- 注意:
immutable仅适用于文件名含哈希(如app.a1b2c3.js)的资源,它能真正阻止 F5 触发的If-None-Match请求
验证配置是否生效
完成配置后,务必验证响应头是否正确输出:
- 语法检查:
/usr/local/apache2/bin/apachectl -t - 重载服务:
/usr/local/apache2/bin/apachectl graceful - 用 curl 测试(以 logo.png 为例):
curl -I https://yoursite.com/logo.png
应同时看到:
–Expires: Wed, 20 Aug 2027 22:46:00 GMT
–Cache-Control: public, max-age=31536000 - 也可打开 Chrome DevTools → Network → 刷新页面 → 点击任意静态资源 → 查看 Headers 标签页

















