必须先启用mod_deflate、mod_filter和mod_headers三模块,否则所有Gzip配置均无效;需取消httpd.conf中对应LoadModule行的注释并重启Apache,规则须写入httpd.conf末尾而非.htaccess,且按实际Content-Type精准匹配MIME类型。

不启用 mod_deflate 模块,后续所有 Gzip 配置都无效——这是 XAMPP 用户开启压缩失败的首要原因,不是规则写错,而是模块根本没加载。
必须先取消三行注释:deflate、filter、headers
XAMPP 默认只编译了模块,但全部被注释掉。光开 deflate_module 不够,filter_module 和 headers_module 是隐性依赖:前者让压缩能介入响应流,后者用于加 Vary: Accept-Encoding 头(否则 CDN 或代理可能缓存错版本)。
- 打开
C:\xampp\apache\conf\httpd.conf(Windows)或/Applications/XAMPP/xamppfiles/etc/httpd.conf(macOS) - 搜索
mod_deflate.so,删掉这行开头的#:LoadModule deflate_module modules/mod_deflate.so - 同样处理这两行:
LoadModule filter_module modules/mod_filter.so、LoadModule headers_module modules/mod_headers.so - 保存后,必须通过 XAMPP Control Panel 点 Stop → Start(仅刷新页面或重载配置不生效)
AddOutputFilterByType DEFLATE 的 MIME 类型要精准匹配响应头
压缩按实际返回的 Content-Type 触发,不是按文件后缀。比如一个 .js 文件如果由 PHP 动态输出且没设 header,它可能返回 text/plain,而你的规则只写了 application/javascript,那它就不会被压。
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 推荐配置(覆盖主流文本资源):
AddOutputFilterByType DEFLATE text/html text/plain text/css application/javascript application/json application/xml - 别写
AddOutputFilterByType DEFLATE *—— Apache 不支持通配符,会直接报错Invalid command - 现代 JS 应用
application/javascript,而非过时的text/javascript;漏配就等于没压 JS - 不要加
application/x-httpd-php—— PHP 层若开了zlib.output_compression = On(见php.ini),会导致头冲突,Apache 会跳过压缩
规则必须写在 httpd.conf 末尾,别碰 .htaccess
XAMPP 默认设置 AllowOverride None,意味着 .htaccess 文件里的任何 AddOutputFilterByType 都不会被读取。写在那里等于白写,还会让人误以为“配置对但没效果”。
- 把整个
<IfModule mod_deflate.c>...</IfModule>块追加到httpd.conf文件最底部 - 如果配了多端口(如
<VirtualHost *:8080>),规则仍要放全局主配置里,不能塞进某个<VirtualHost>内部——否则 Apache 会报Invalid command 'AddOutputFilterByType' - 可选加一行:
Header append Vary Accept-Encoding(需包在<IfModule mod_headers.c>里),避免代理缓存歧义
验证是否生效:看响应头和传输体积,不是看配置文件
浏览器 Network 面板里 Content-Encoding: gzip 没出现?大概率是以下某一点卡住了:
- Apache 没真正重启:Control Panel 显示 “Running” 不代表新配置已加载,必须 Stop 再 Start
- PHP 提前输出了编码头:检查
php.ini中zlib.output_compression = Off - 浏览器缓存了旧响应:强制刷新(Ctrl+F5)或清空缓存,再对比 Size 列(如从 12KB → 3KB 才算成功)
- MIME 类型不匹配:用 curl 测真实响应头:
curl -I http://localhost/test.js,确认Content-Type是你规则里写的那个
最容易被忽略的是:你以为改了配置就完事了,其实 Apache 还在跑老进程;或者你盯着 .htaccess 死磕,却忘了 XAMPP 根本不读它。

















