需手动启用mod_expires和mod_headers模块,并在虚拟主机配置中用ExpiresActive on和ExpiresByType设置规则,同时用Header set补充Cache-Control头;未加载模块会导致ExpiresActive命令报错,响应头缺失则浏览器不缓存。

phpEnv 里 Apache 的缓存不能靠 php.ini 或 .htaccess 自动生效,必须手动启用 mod_expires 和 mod_headers 模块,并在虚拟主机或主配置中显式写 ExpiresByType 规则——否则浏览器永远收不到 Expires 或 Cache-Control: max-age 头。
怎么确认 phpEnv 的 Apache 已加载 expires 模块
phpEnv 默认不启用缓存模块,即使配置文件里有 LoadModule expires_module modules/mod_expires.so,也可能被注释或路径错误。
- 打开 phpEnv 安装目录下的
Apache24\conf\httpd.conf,搜索mod_expires,确保这一行没被#注释:LoadModule expires_module modules/mod_expires.so - 同样检查
mod_headers是否启用:LoadModule headers_module modules/mod_headers.so - 命令行进入
Apache24\bin\目录,执行:httpd.exe -t验证语法;若报错 “Invalid command 'ExpiresActive'”,说明模块没加载成功 - Windows 下常见路径问题:phpEnv 的
modules/目录可能实际在Apache24\modules\,但httpd.conf里写的却是相对路径modules/mod_expires.so——需确认该文件真实存在
在 phpEnv 虚拟主机配置中设置静态资源过期时间
phpEnv 通常用 Apache24\conf\extra\httpd-vhosts.conf 管理站点,缓存规则必须写在 <VirtualHost> 内且包裹在 <IfModule mod_expires.c> 中,否则启动会失败或静默忽略。
- 务必先开启开关:
ExpiresActive on - 对带哈希的 JS/CSS(如
app.abc123.js)用access基准:ExpiresByType application/javascript "access plus 1 year" - 对无版本号的
style.css,改用modification基准并确保 Apache 能读取文件 mtime:ExpiresByType text/css "modification plus 2 hours" - 避免用
now plus X:它基于服务器当前时间,每次请求都重新计算,无法实现稳定缓存;access和modification才是可预测的 - 加
Cache-Control补充头更稳妥(需mod_headers):Header set Cache-Control "public, immutable"(仅适用于内容不变的哈希文件)
为什么改了配置但浏览器仍不缓存
常见不是配置写错了,而是响应头根本没发出去——多数因为条件未满足或被覆盖。
立即学习“PHP免费学习笔记(深入)”;
- 检查响应头是否真包含
Cache-Control或Expires:用 Chrome DevTools 的 Network 标签页点开某个 JS/CSS 请求,看 Headers → Response Headers - 如果看到
Cache-Control: no-store或max-age=0,可能是 PHP 脚本(比如 index.php)输出了冲突头,或 Apache 其他地方(如.htaccess)写了Header unset - phpEnv 默认把所有
.php请求交给 PHP 处理,但静态资源(.js/.css/.png)应绕过 PHP;确认请求的 URL 确实命中的是文件系统路径,而不是被伪静态规则重写到 PHP 脚本 - Windows 下注意路径分隔符:在
httpd-vhosts.conf中写<Directory "D:/phpenv/www">,别用反斜杠\,否则ExpiresByType可能不生效
最易被忽略的一点:phpEnv 启动 Apache 时可能读的是缓存的配置快照,或者用了 Windows 服务方式启动导致配置未重载。改完配置后,不要只点托盘图标“重启”,而要进命令行执行 Apache24\bin\httpd.exe -k restart,并观察控制台是否有模块加载错误。缓存行为是否生效,最终只看浏览器收到的响应头,其他全是假设。



















