apache不支持自动识别预压缩文件,需通过mod_rewrite检查.gz存在性并重写路径,配合mod_headers设置content-encoding与content-type,禁用fileetag确保缓存一致。

DocumentRoot 本身只定义静态文件的根目录位置,不参与压缩逻辑。真正起作用的是后续加载的模块和规则——你需要在 DocumentRoot 指向的目录基础上,叠加 mod_deflate(实时压缩)或 mod_rewrite + mod_headers(预压缩文件自动分发)两套机制。
DocumentRoot 是起点,不是终点
它只是告诉 Apache “静态文件放这儿”,比如:
DocumentRoot "/var/www/html"
ServerName example.com
所有 /style.css、/app.js 请求都会从 /var/www/html/ 下查找。但要不要压缩、怎么压缩、发哪个版本(.gz 还是原文件),全靠后面配置决定。
两种压缩方式选一种,别混用
方式一:mod_deflate 实时压缩(简单可靠)
适合中小流量、CPU 资源尚可的场景,无需提前生成 .gz 文件:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 确保已启用
mod_deflate和mod_headers - 在 VirtualHost 或主配置中加:
AddOutputFilterByType DEFLATE text/html text/css application/javascript application/json image/svg+xml
SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png|ico|webp|woff2?)$ no-gzip dont-vary
Header append Vary Accept-Encoding
方式二:预压缩文件自动分发(高性能首选)
适合高并发、带宽敏感场景,需提前生成 .js.gz、.css.gz 等:
- 在 DocumentRoot 目录下,对每个
main.js执行gzip -k -9 main.js,得到main.js.gz - 确保 .gz 文件权限与原文件一致(如 644),且与原文件同目录
- 添加重写与响应头规则(必须放在 VirtualHost 内):
RewriteEngine On
RewriteCond %{HTTP:Accept-Encoding} gzip
RewriteCond %{REQUEST_FILENAME}.gz -f
RewriteRule ^(.+\.(js|css|html|json|svg))$$1.gz [L]
Header append Vary Accept-Encoding
Header set Content-Encoding gzip
Header set Content-Type "application/javascript; charset=utf-8"
Header set Content-Encoding gzip
Header set Content-Type "text/css; charset=utf-8"
关键细节不能漏
-
Content-Type 必须手动指定:Apache 不会从 .gz 文件反推原始类型,
app.js.gz若返回text/plain,浏览器会拒绝执行 JS -
禁用 ETag:在 DocumentRoot 对应的
<directory></directory>块里加FileETag None,避免预压缩和未压缩版本缓存冲突 -
Alias 路径不适用:如果用
Alias /static /data/assets挂载非 DocumentRoot 目录,-f条件可能失效,需确认FollowSymLinks开启或改用ScriptAlias - 别写 gzip_static on:这是 Nginx 指令,Apache 不识别,配置会直接启动失败
验证是否生效
用 curl 测试:
- 请求 JS 文件并带上 gzip 支持:
curl -H "Accept-Encoding: gzip" -I http://example.com/app.js,看响应头是否有Content-Encoding: gzip - 对比大小:
curl -H "Accept-Encoding: gzip" http://example.com/app.js | wc -c应明显小于未带头的请求 - 浏览器开发者工具 Network 标签页,查看资源的 Size 列是否显示 “from memory cache” 或 “from disk cache”,且 Transferred 明显小于 Resource Size










