应精准配置 mod_deflate 的 mime 类型过滤:仅对 text/html、text/css 等文本及 json/xml 等结构化数据启用压缩;禁用 image/、video/、pdf 等已压缩类型;避免使用 setoutputfilter 全局启用,改用 addoutputfilterbytype;辅以 setenvifnocase 排除高危路径;通过 deflatefilternote 日志验证实际压缩效果。

配置 Apache mod_deflate 的过滤类型,核心是精准指定哪些 MIME 类型该压缩、哪些必须跳过,而不是简单“全开”或依赖文件后缀。关键在于用 AddOutputFilterByType 明确声明类型,避免误压二进制资源。
只对文本类和可压缩的结构化数据启用
mod_deflate 对已高度压缩的资源(如 JPG、MP4、PDF)再压缩不仅无效,还会浪费 CPU。应聚焦在纯文本及高冗余度内容上:
- 推荐启用的类型:text/html、text/css、text/javascript、text/plain、text/xml、application/json、application/javascript、application/xml、application/xhtml+xml
- 字体类可选加:font/woff2、font/ttf、application/font-woff(现代字体本身压缩率高,但部分场景仍受益)
- 慎用或不加的类型:image/*、video/*、audio/*、application/pdf、application/zip —— 这些类型默认不压缩,强行加入会触发无意义处理甚至响应异常
别用 SetOutputFilter 全局启用
SetOutputFilter DEFLATE 会尝试对所有响应启用压缩,包括未识别 MIME 类型或二进制流,容易导致客户端解析失败(比如 API 返回的二进制 blob 被错误截断)。它也不区分浏览器兼容性,风险较高。
更安全的做法是只用 AddOutputFilterByType,它严格按 Apache 内部判定的 Content-Type 生效,与文件扩展名无关,适合 REST 接口返回 JSON 或动态生成的 JS/CSS。
排除特定请求路径(补充防护)
即使 MIME 类型判断准确,某些静态资源路径(如 /images/、/uploads/)仍可能因配置疏漏返回 text/plain 等可压缩类型。可用 SetEnvIfNoCase 主动屏蔽:
SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png|webp|mp4|avi|pdf|zip|exe)$ no-gzip dont-vary- 这条规则优先于 AddOutputFilterByType,确保匹配路径的响应彻底跳过压缩流程
验证是否按预期过滤
启用 DeflateFilterNote 并配合日志,能看清每类响应的实际处理情况:
- 在配置中加入:
DeflateFilterNote Input instream、DeflateFilterNote Output outstream、DeflateFilterNote Ratio ratio - 添加日志格式:
LogFormat '"%r" %{outstream}n/%{instream}n (%{ratio}n%%)' deflate、CustomLog logs/deflate_log deflate - 查看日志中类似
"GET /style.css HTTP/1.1" 1234/5678 (78.2%)表示成功压缩;若出现0/0 (0%)或INFLATE: 0,说明该响应被跳过(正常,不是故障)










