<-
Apache > HTTP 服务器 > 文档 > 版本 2.4 > 模块

Apache 模块 mod_deflate

可用语言:  en  |  fr  |  ja  |  ko 

描述在内容传递给客户端之前压缩内容
状态扩展
模块标识符deflate_module
源文件mod_deflate.c

摘要

mod_deflate 模块提供 DEFLATE 输出过滤器,允许在服务器输出通过网络发送到客户端之前进行压缩。

Support Apache!

主题

指令

错误修复清单

另请参阅

top

支持的编码

gzip 编码是唯一支持的编码,以确保与旧浏览器实现的完全兼容。deflate 编码不受支持,请查看 zlib 文档 以获取完整解释。

top

示例配置

压缩和 TLS

当 TLS 连接传输 deflate 压缩数据时,某些 Web 应用程序容易受到信息泄露攻击。有关更多信息,请查看“BREACH”系列攻击的详细信息。

这是一个简单的配置,它压缩常见的基于文本的内容类型。

仅压缩少数类型

AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript application/javascript
top

启用压缩

压缩和 TLS

当 TLS 连接传输 deflate 压缩数据时,某些 Web 应用程序容易受到信息泄露攻击。有关更多信息,请查看“BREACH”系列攻击的详细信息。

输出压缩

压缩由 DEFLATE 过滤器 实现。以下指令将为放置它的容器中的文档启用压缩

SetOutputFilter DEFLATE
SetEnvIfNoCase Request_URI "\.(?:gif|jpe?g|png)$" no-gzip

如果您想将压缩限制在特定 MIME 类型,可以使用 AddOutputFilterByType 指令。以下是如何仅为 Apache 文档的 html 文件启用压缩的示例

<Directory "/your-server-root/manual">
    AddOutputFilterByType DEFLATE text/html
</Directory>

注意

DEFLATE 过滤器始终插入 RESOURCE 过滤器(如 PHP 或 SSI)之后。它从不处理内部子请求。

注意

有一个环境变量 force-gzip,通过 SetEnv 设置,它将忽略浏览器的 accept-encoding 设置,并发送压缩输出。

输出解压缩

mod_deflate 模块还提供了一个用于压缩/解压缩 gzip 压缩响应体的过滤器。要激活此功能,您必须使用 SetOutputFilterAddOutputFilterINFLATE 过滤器插入输出过滤器链中,例如

<Location "/dav-area">
    ProxyPass "http://example.com/"
    SetOutputFilter INFLATE
</Location>

此示例将解压缩来自 example.com 的 gzip 压缩输出,以便其他过滤器可以对其进行进一步处理。

输入解压缩

mod_deflate 模块还提供了一个用于解压缩 gzip 压缩请求体的过滤器。要激活此功能,您必须使用 SetInputFilterAddInputFilterDEFLATE 过滤器插入输入过滤器链中,例如

<Location "/dav-area">
    SetInputFilter DEFLATE
</Location>

现在,如果请求包含 Content-Encoding: gzip 标头,则主体将自动解压缩。很少有浏览器能够压缩请求主体。但是,某些特殊应用程序确实支持请求压缩,例如某些 WebDAV 客户端。

关于 Content-Length 的说明

如果您自己评估请求主体,不要相信 Content-Length 标头! Content-Length 标头反映了来自客户端的传入数据的长度,而不是解压缩数据流的字节数。

top

处理代理服务器

mod_deflate 模块发送 Vary: Accept-Encoding HTTP 响应标头,以提醒代理服务器仅将缓存的响应发送到发送适当 Accept-Encoding 请求标头的客户端。这可以防止将压缩内容发送到无法理解它的客户端。

如果您使用一些依赖于(例如)User-Agent 标头的特殊排除项,则必须手动配置对 Vary 标头的添加,以提醒代理服务器有关其他限制的信息。例如,在典型的配置中,DEFLATE 过滤器的添加取决于 User-Agent,您应该添加

Header append Vary User-Agent

如果您的压缩决策依赖于除请求标头之外的其他信息(例如 HTTP 版本),则必须将 Vary 标头设置为值 *。这将阻止符合标准的代理服务器完全缓存。

示例

Header set Vary *
top

提供预压缩内容

由于 mod_deflate 在每次请求时都会重新压缩内容,因此可以通过预压缩内容并告诉 mod_deflate 在不重新压缩的情况下提供它们来获得一些性能优势。这可以通过使用以下配置来实现

<IfModule mod_headers.c>
    # Serve gzip compressed CSS and JS files if they exist
    # and the client accepts gzip.
    RewriteCond "%{HTTP:Accept-encoding}" "gzip"
    RewriteCond "%{REQUEST_FILENAME}\.gz" -s
    RewriteRule "^(.*)\.(css|js)"         "$1\.$2\.gz" [QSA]

    # Serve correct content types, and prevent mod_deflate double gzip.
    RewriteRule "\.css\.gz$" "-" [T=text/css,E=no-gzip:1]
    RewriteRule "\.js\.gz$"  "-" [T=text/javascript,E=no-gzip:1]


    <FilesMatch "(\.js\.gz|\.css\.gz)$">
      # Serve correct encoding type.
      Header append Content-Encoding gzip

      # Force proxies to cache gzipped &
      # non-gzipped css/js files separately.
      Header append Vary Accept-Encoding
    </FilesMatch>
</IfModule>
top

DeflateAlterETag 指令

描述压缩期间如何修改传出的 ETag 标头
语法DeflateAlterETag AddSuffix|NoChange|Remove
默认值DeflateAlterETag AddSuffix
上下文服务器配置,虚拟主机
状态扩展
模块mod_deflate
兼容性在 Apache 2.4.58 及更高版本中可用

DeflateAlterETag 指令指定在压缩响应时如何更改 ETag 标头。

AddSuffix

将压缩方法追加到 ETag 的末尾,导致压缩和未压缩表示具有唯一的 ETag。自 2.4.0 以来,这已成为默认设置,但会阻止对压缩内容的条件请求提供“HTTP 未修改”(304)响应。

NoChange

不要更改压缩响应的 ETag。这在 2.4.0 之前是默认设置,但不能满足 HTTP/1.1 属性,即同一资源的所有表示都具有唯一的 ETag。

Remove

从压缩响应中删除 ETag 标头。这会阻止某些条件请求,但会避免上述选项的缺点。

top

DeflateBufferSize 指令

描述zlib 每次压缩的片段大小
语法DeflateBufferSize value
默认值DeflateBufferSize 8096
上下文服务器配置,虚拟主机
状态扩展
模块mod_deflate

DeflateBufferSize 指令指定 zlib 每次压缩的片段大小(以字节为单位)。如果压缩响应大小大于此指令指定的大小,则 httpd 将切换到分块编码(HTTP 标头 Transfer-Encoding 设置为 Chunked),其副作用是不设置任何 Content-Length HTTP 标头。这在 httpd 在反向缓存代理后面运行时或 httpd 配置了 mod_cachemod_cache_disk 时尤其重要,因为没有 Content-Length 标头的 HTTP 响应可能无法被缓存。

top

DeflateCompressionLevel 指令

描述我们对输出应用多少压缩
语法DeflateCompressionLevel value
默认值Zlib 的默认值
上下文服务器配置,虚拟主机
状态扩展
模块mod_deflate

DeflateCompressionLevel 指令指定应使用哪种压缩级别,值越高,压缩效果越好,但实现此压缩所需的 CPU 时间也越多。

该值必须介于 1(压缩较少)和 9(压缩更多)之间。

top

DeflateFilterNote 指令

描述将压缩率放在日志记录的注释中
语法DeflateFilterNote [type] notename
上下文服务器配置,虚拟主机
状态扩展
模块mod_deflate

DeflateFilterNote 指令指定应将有关压缩率的注释附加到请求。注释的名称是为指令指定的值。您可以通过将该值添加到 访问日志 中来将该注释用于统计目的。

示例

DeflateFilterNote ratio

LogFormat '"%r" %b (%{ratio}n) "%{User-agent}i"' deflate
CustomLog "logs/deflate_log" deflate

如果您想从日志中提取更准确的值,可以使用 type 参数指定作为日志记录注释留下的数据类型。 type 可以是以下之一

Input
将过滤器的输入流的字节数存储在注释中。
Output
将过滤器的输出流的字节数存储在注释中。
Ratio
将压缩率(output/input * 100)存储在注释中。这是默认值,如果省略了 type 参数。

因此,您可以这样记录它

准确的日志记录

DeflateFilterNote Input instream
DeflateFilterNote Output outstream
DeflateFilterNote Ratio ratio

LogFormat '"%r" %{outstream}n/%{instream}n (%{ratio}n%%)' deflate
CustomLog "logs/deflate_log" deflate

另请参阅

top

DeflateInflateLimitRequestBody 指令

描述膨胀的请求主体的最大大小
语法DeflateInflateLimitRequestBody value
默认值无,但 LimitRequestBody 在解压缩后应用
上下文服务器配置,虚拟主机,目录,.htaccess
状态扩展
模块mod_deflate
兼容性2.4.10 及更高版本

指令 DeflateInflateLimitRequestBody 指定了解压缩后的请求主体最大尺寸。如果未设置,则 LimitRequestBody 将应用于解压缩后的主体。

top

DeflateInflateRatioBurst 指令

描述请求主体解压缩比率可以超过的最大次数
语法DeflateInflateRatioBurst value
默认值DeflateInflateRatioBurst 3
上下文服务器配置,虚拟主机,目录,.htaccess
状态扩展
模块mod_deflate
兼容性2.4.10 及更高版本

指令 DeflateInflateRatioBurst 指定了在终止请求之前,可以超过 DeflateInflateRatioLimit 的最大次数。

top

DeflateInflateRatioLimit 指令

描述请求主体最大解压缩比率
语法DeflateInflateRatioLimit value
默认值DeflateInflateRatioLimit 200
上下文服务器配置,虚拟主机,目录,.htaccess
状态扩展
模块mod_deflate
兼容性2.4.10 及更高版本

指令 DeflateInflateRatioLimit 指定了解压缩后的请求主体,压缩前大小与解压缩后大小的最大比率。此比率在主体流式传输时进行检查,如果超过 DeflateInflateRatioBurst 次,则请求将被终止。

top

DeflateMemLevel 指令

描述zlib 用于压缩的内存使用量
语法DeflateMemLevel value
默认值DeflateMemLevel 9
上下文服务器配置,虚拟主机
状态扩展
模块mod_deflate

指令 DeflateMemLevel 指定了 zlib 用于压缩的内存使用量(值介于 1 到 9 之间)。

top

DeflateWindowSize 指令

描述zlib 压缩窗口大小
语法DeflateWindowSize value
默认值DeflateWindowSize 15
上下文服务器配置,虚拟主机
状态扩展
模块mod_deflate

指令 DeflateWindowSize 指定了 zlib 压缩窗口大小(值介于 1 到 15 之间)。通常,窗口大小越大,压缩率就越高。

可用语言:  en  |  fr  |  ja  |  ko 

top

评论

注意
这不是问答区。此处放置的评论应针对改进文档或服务器的建议,如果这些评论已被实施或被认为无效/与主题无关,则可能会被我们的版主删除。有关如何管理 Apache HTTP Server 的问题,请咨询我们的 IRC 频道 #httpd(在 Libera.chat 上)或发送到我们的 邮件列表