必须手动启用mod_expires模块,否则所有expiresactive和expiresbytype配置均被静默忽略;需在httpd.conf中取消#loadmodule expires_module modules/mod_expires.so注释、重启apache,并在中配置expiresactive on及具体规则。

mod_expires 模块必须手动启用,否则所有 ExpiresActive 和 ExpiresByType 配置都会被 Apache 静默忽略——这是本地开发中缓存不生效的最常见原因。
确认并启用 mod_expires 模块
Windows 版 XAMPP 默认禁用该模块,即使你写了完整规则,Apache 也不会处理。关键动作只有两步:
1. 打开 C:\XAMPP\apache\conf\httpd.conf,搜索 LoadModule expires_module modules/mod_expires.so
2. 删除该行开头的 #(如果存在);若整行缺失,则在其他 LoadModule 行附近手动添加
3. 保存后必须重启 Apache(仅点击“Start”不够,要先 Stop 再 Start,或用命令行 httpd -k restart)
验证是否加载成功:运行 httpd -M | findstr expires,输出应含 expires_module (shared)
在 httpd.conf 中写入有效缓存规则
把规则放在 .htaccess 里容易失效——XAMPP 默认设 AllowOverride None,且 .htaccess 解析有性能开销。直接写进主配置更稳:
• 在 httpd.conf 文件末尾追加以下内容(注意引号、空格、大小写全匹配):
XAMPP 8.0.30 是一款免费、开源的跨平台 Web 服务器集成包,专为快速搭建本地 PHP 开发环境而设计。该版本核心组件包括:Apache 2.4.56、MySQL 8.0.33、PHP 8.0.30、phpMyAdmin 5.2.1 等。它支持 Windows、Linux 和 macOS 系统,可让开发者在个人电脑上轻松模拟服务器环境,无需复杂配置即可运行 WordPress、ThinkPHP 等主流 PHP 应用。XAMPP 8.0.30 在保持兼容性的同时,优化了 PHP 8.0 的性能与
<ifmodule mod_expires.c><br> ExpiresActive On<br> ExpiresDefault "access plus 1 week"<br> ExpiresByType text/css "access plus 1 month"<br> ExpiresByType application/javascript "access plus 1 month"<br> ExpiresByType image/jpeg "access plus 1 year"<br> ExpiresByType image/png "access plus 1 year"<br> ExpiresByType image/gif "access plus 1 year"<br> ExpiresByType image/x-icon "access plus 1 year"<br></ifmodule>
•
"access plus N" 表示从浏览器发起请求那一刻起算,比 modification 更可控,适合本地开发和静态资源部署• 不要给
text/html 设长缓存——HTML 页面通常动态生成,建议删掉或显式设为 "access plus 5 minutes",避免改完 PHP 模板却看不到效果
多端口开发时缓存规则必须按 <virtualhost></virtualhost> 分离
如果你在 httpd-vhosts.conf 中配了 :8080、:8081 等多个端口,全局写的 Expires 规则只对默认 :80 生效。
每个端口需单独声明缓存策略:
• 在对应 <virtualhost></virtualhost> 块内,把 ExpiresActive On 和 ExpiresByType 放进 <directory></directory> 段里
• 确保该 <directory></directory> 的 AllowOverride 是 All(否则子目录下 .htaccess 的缓存指令也无效)
• 路径中不要带尾斜杠:DocumentRoot "C:/xampp/htdocs/myapp" 正确,"C:/xampp/htdocs/myapp/" 可能导致 403
用开发者工具验证响应头是否真实发出
别只看页面“变快了”就认为缓存生效——可能是 DNS 缓存、磁盘缓存或 Chrome 预加载干扰。
真验证只有一条路:
• 打开 Chrome DevTools → Network 标签页
• 刷新页面,点一个 JS 或 CSS 文件
• 在 Headers → Response Headers 区域找 Expires 和 Cache-Control 字段
• 如果没看到,检查 Apache 错误日志(C:\XAMPP\apache\logs\error.log),常见问题包括:
– EXpiresByType 拼错成大写 E
– MIME 类型写错(比如把 application/javascript 写成 text/javascript,现代浏览器已不认后者)
– ExpiresActive On 没写在 <ifmodule mod_expires.c></ifmodule> 块内,导致被跳过










