优先使用apache的mod_deflate模块压缩php输出,禁用php的zlib.output_compression;配置addoutputfilterbytype和filesmatch强制对.php文件启用deflate,并确保mod_deflate已加载且php侧无冲突压缩设置。

Apache配置PHP Gzip压缩的两种有效路径
Apache本身不直接压缩PHP输出,而是通过模块(mod_deflate)对响应体做压缩;PHP自身也有zlib.output_compression机制,但二者混用容易导致双重压缩或Header冲突。优先用mod_deflate,禁用PHP侧压缩。
启用mod_deflate并匹配PHP响应类型
确保mod_deflate已加载(a2enmod deflate),并在虚拟主机或.htaccess中配置:
<IfModule mod_deflate.c>
# 压缩常见文本类型,含PHP生成的HTML/CSS/JS
AddOutputFilterByType DEFLATE text/html text/plain text/css text/javascript application/javascript application/json
# 强制对PHP脚本输出启用压缩(关键:PHP默认Content-Type是text/html,但有时未被匹配)
<FilesMatch "\.php$">
SetOutputFilter DEFLATE
</FilesMatch>
</IfModule>-
AddOutputFilterByType依赖响应头中的Content-Type,而PHP脚本若手动设了header("Content-Type: application/json"),需显式加入该类型 -
SetOutputFilter DEFLATE绕过MIME类型判断,对.php文件强制启用,更可靠 - 不要在
<filesmatch></filesmatch>里写php5或php7——扩展名就是.php
关闭PHP自身的zlib.output_compression
PHP开启zlib.output_compression = On会提前压缩输出,和mod_deflate叠加后可能引发ERR_CONTENT_DECODING_FAILED。必须关掉:
- 检查
php.ini:把zlib.output_compression = Off(不是0或"") - 若用
ini_set()动态开启过,需在脚本开头立即关:ini_set('zlib.output_compression', '0'); -
ob_gzhandler也得禁用——它和mod_deflate不兼容,且已被PHP 8.0废弃
验证是否生效及常见失败点
用curl -I -H "Accept-Encoding: gzip" http://yoursite.com/test.php查看响应头:
立即学习“PHP免费学习笔记(深入)”;
- 成功时应含
Content-Encoding: gzip和Vary: Accept-Encoding - 若只有
Vary没Content-Encoding,可能是PHP脚本里调用了header("Content-Encoding: ...")覆盖了Apache设置 - 若返回
500且错误日志报Invalid argument: deflate_filter,说明mod_deflate没加载或配置语法错 - Chrome开发者工具Network面板里看Response Headers比curl更直观,注意对比“Size”列里的“transferred”和“resource”大小差异
最易忽略的是:PHP-FPM环境下,.htaccess可能不生效,必须把mod_deflate配置写进Apache主配置或虚拟主机块里。











