必须先运行httpd -M | findstr deflate确认显示deflate_module (shared),再检查httpd.conf中LoadModule deflate_module modules/mod_deflate.so已启用且modules/目录下存在该文件,否则配置无效。

phpEnv 里 Apache 默认不启用 mod_deflate,光写配置没用——必须先确认模块已加载、再配 MIME 类型白名单,否则 Gzip 压缩根本不会触发。
怎么确认 mod_deflate 真的启用了
别只改配置文件就以为完事了。Windows 下没有 a2enmod,得手动验证:
- 打开命令行,
cd到 phpEnv 的Apache\bin目录(比如C:\phpEnv\Apache\bin) - 运行:
httpd -M | findstr deflate,看到deflate_module (shared)才算成功 - 如果没输出,检查
httpd.conf里这行是否取消注释:LoadModule deflate_module modules/mod_deflate.so - 再确认
modules/目录下真有mod_deflate.so文件(不是 Linux 版本的 .so,也不能是空文件) - 改完必须重启 phpEnv 的 Apache 服务(点面板“重启 Apache”,不是刷新网页)
AddOutputFilterByType 必须严格小写 + 无分号 + 无逗号
Apache 2.4 对 MIME 类型匹配极其敏感,错一个字符就失效:
- ✅ 正确写法:
AddOutputFilterByType DEFLATE text/html application/json text/css application/javascript - ❌ 错误写法:
AddOutputFilterByType DEFLATE text/html, application/json(逗号不行) - ❌ 错误写法:
AddOutputFilterByType DEFLATE Text/HTML(大小写敏感,必须全小写) - ❌ 错误写法:
AddOutputFilterByType DEFLATE application/json; charset=utf-8(分号及之后内容被忽略,类型匹配失败) - PHP 输出 JSON 时设了
header('Content-Type: application/json; charset=utf-8')?Apache 只认application/json这部分,所以配置里写对前缀就行
怎么避免 PNG、PDF、Excel 被错误压缩
mod_deflate 没有 DeflateExclude 指令,不能靠后缀“禁用”,得用环境变量跳过:
- 在
AddOutputFilterByType之前加这行,排除常见二进制文件:SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png|pdf|woff2|eot|ttf|swf|zip|exe)$ no-gzip - 如果某个 PHP 脚本(如
/export.php)输出 raw image/png 或 ZIP 流,可在脚本开头加:header('Vary:');和header('Content-Encoding:');,再配合SetEnvIf Request_URI "/export\.php$" no-gzip - 别用
SetOutputFilter DEFLATE全局启用——它会压所有响应,包括没设Content-Type的 PHP 输出,容易导致乱码或 500 错误
别忘了 Vary: Accept-Encoding 和 mod_headers
CDN 和浏览器缓存依赖这个头判断是否缓存压缩版内容:
- 先确认
mod_headers已启用:LoadModule headers_module modules/mod_headers.so(同样要取消注释) - 在
块里加:Header append Vary Accept-Encoding - 验证方式:用 Chrome DevTools → Network → 点一个 HTML/JS 请求 → 查看 Response Headers 里是否有
Content-Encoding: gzip和Vary: Accept-Encoding
最容易被忽略的是:模块是否真加载、MIME 类型是否严格小写、以及二进制响应没被 no-gzip 拦住——这三个点任一出错,压缩就静默失效,连错误日志都不报。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











