如何为Magento 2站点的PHP生成页面启用Gzip压缩?
问题描述
我在.htaccess里配置了以下Gzip压缩规则:
# Insert filter on all content SetOutputFilter DEFLATE # Insert filter on selected content types only AddOutputFilterByType DEFLATE text/plain AddOutputFilterByType DEFLATE text/html AddOutputFilterByType DEFLATE text/xml AddOutputFilterByType DEFLATE text/css AddOutputFilterByType DEFLATE application/xml AddOutputFilterByType DEFLATE application/xhtml+xml AddOutputFilterByType DEFLATE application/rss+xml AddOutputFilterByType DEFLATE application/javascript AddOutputFilterByType DEFLATE application/x-javascript
目前静态内容都能正常返回Content-Encoding: gzip,但Magento 2生成的PHP动态页面却没启用压缩,GTmetrix一直提示要处理这类页面。这套配置在我另一个非Magento项目里是正常生效的,想问问怎么给Magento 2的PHP动态页面开启Gzip压缩?
解决思路和方法
Magento 2因为自身的前端优化机制,有时候会和服务器的.htaccess规则产生冲突,我之前处理过类似的问题,给你几个实用的方向试试:
1. 先检查Magento后台的压缩相关配置
Magento自带了不少前端优化选项,可能会覆盖服务器的设置:
- 登录后台,进入
Stores > Configuration > Advanced > Developer - 先确认JS和CSS的压缩、打包选项状态,不过更关键的是去
Stores > Configuration > General > Web > Default Settings > HTTP Header - 看看
Enable HTTP/2 Server Push有没有开启,部分版本这里还有Gzip Compression的开关,确保这些配置和服务器的规则不冲突
2. 调整.htaccess规则,针对PHP输出做兼容
有时候Magento的PHP输出会绕过Apache的DEFLATE过滤器,你可以在现有规则后面加几行:
# 确保PHP生成的动态HTML被压缩 AddOutputFilterByType DEFLATE application/x-httpd-php AddOutputFilterByType DEFLATE application/x-httpd-php-html # 关闭PHP自身的输出压缩,避免和Apache的DEFLATE冲突 php_flag zlib.output_compression Off
这里重点是关掉PHP的zlib.output_compression,如果这个选项开启的话,Apache的DEFLATE可能就不起作用了。
3. 检查服务器的PHP配置
登录服务器,找到php.ini文件,确认这两个配置:
zlib.output_compression:必须设为Off,不然会和Apache的压缩规则冲突zlib.output_compression_level:这个如果上面的选项开启才会生效,我们直接关掉上面的就行- 改完后记得重启Apache服务,让配置生效
4. 验证Magento的部署模式
如果你的站点是生产模式,要确保已经执行过静态资源部署命令:
php bin/magento setup:static-content:deploy
生产模式下Magento会自动处理静态资源,但动态页面还是得靠服务器的规则,所以前面的调整还是必须的。
5. 测试压缩是否生效
改完配置后,用curl命令测试一下动态页面:
curl -I -H "Accept-Encoding: gzip" https://你的Magento站点域名/
如果响应头里出现Content-Encoding: gzip,就说明配置生效了。
内容的提问来源于stack exchange,提问作者Audiophile
相关产品推荐
相关产品推荐

