Apache HTTP Server 版本 2.4
描述 | 在内容传递给客户端之前压缩内容 |
---|---|
状态 | 扩展 |
模块标识符 | deflate_module |
源文件 | mod_deflate.c |
模块提供 mod_deflate
DEFLATE
输出过滤器,允许在服务器输出通过网络发送到客户端之前进行压缩。
当 TLS 连接传输 deflate 压缩数据时,某些 Web 应用程序容易受到信息泄露攻击。有关更多信息,请查看“BREACH”系列攻击的详细信息。
这是一个简单的配置,它压缩常见的基于文本的内容类型。
AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript application/javascript
当 TLS 连接传输 deflate 压缩数据时,某些 Web 应用程序容易受到信息泄露攻击。有关更多信息,请查看“BREACH”系列攻击的详细信息。
压缩由 DEFLATE
过滤器 实现。以下指令将为放置它的容器中的文档启用压缩
SetOutputFilter DEFLATE SetEnvIfNoCase Request_URI "\.(?:gif|jpe?g|png)$" no-gzip
如果您想将压缩限制在特定 MIME 类型,可以使用
指令。以下是如何仅为 Apache 文档的 html 文件启用压缩的示例AddOutputFilterByType
<Directory "/your-server-root/manual"> AddOutputFilterByType DEFLATE text/html </Directory>
DEFLATE
过滤器始终插入 RESOURCE 过滤器(如 PHP 或 SSI)之后。它从不处理内部子请求。
模块还提供了一个用于压缩/解压缩 gzip 压缩响应体的过滤器。要激活此功能,您必须使用 mod_deflate
或 SetOutputFilter
将 AddOutputFilter
INFLATE
过滤器插入输出过滤器链中,例如
<Location "/dav-area"> ProxyPass "http://example.com/" SetOutputFilter INFLATE </Location>
此示例将解压缩来自 example.com 的 gzip 压缩输出,以便其他过滤器可以对其进行进一步处理。
模块还提供了一个用于解压缩 gzip 压缩请求体的过滤器。要激活此功能,您必须使用 mod_deflate
或 SetInputFilter
将 AddInputFilter
DEFLATE
过滤器插入输入过滤器链中,例如
<Location "/dav-area"> SetInputFilter DEFLATE </Location>
现在,如果请求包含 Content-Encoding: gzip
标头,则主体将自动解压缩。很少有浏览器能够压缩请求主体。但是,某些特殊应用程序确实支持请求压缩,例如某些 WebDAV 客户端。
如果您自己评估请求主体,不要相信 Content-Length
标头! Content-Length 标头反映了来自客户端的传入数据的长度,而不是解压缩数据流的字节数。
模块发送 mod_deflate
Vary: Accept-Encoding
HTTP 响应标头,以提醒代理服务器仅将缓存的响应发送到发送适当 Accept-Encoding
请求标头的客户端。这可以防止将压缩内容发送到无法理解它的客户端。
如果您使用一些依赖于(例如)User-Agent
标头的特殊排除项,则必须手动配置对 Vary
标头的添加,以提醒代理服务器有关其他限制的信息。例如,在典型的配置中,DEFLATE
过滤器的添加取决于 User-Agent
,您应该添加
Header append Vary User-Agent
如果您的压缩决策依赖于除请求标头之外的其他信息(例如 HTTP 版本),则必须将 Vary
标头设置为值 *
。这将阻止符合标准的代理服务器完全缓存。
Header set Vary *
由于
在每次请求时都会重新压缩内容,因此可以通过预压缩内容并告诉 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>
描述 | 压缩期间如何修改传出的 ETag 标头 |
---|---|
语法 | DeflateAlterETag AddSuffix|NoChange|Remove |
默认值 | DeflateAlterETag AddSuffix |
上下文 | 服务器配置,虚拟主机 |
状态 | 扩展 |
模块 | mod_deflate |
兼容性 | 在 Apache 2.4.58 及更高版本中可用 |
指令指定在压缩响应时如何更改 ETag 标头。DeflateAlterETag
将压缩方法追加到 ETag 的末尾,导致压缩和未压缩表示具有唯一的 ETag。自 2.4.0 以来,这已成为默认设置,但会阻止对压缩内容的条件请求提供“HTTP 未修改”(304)响应。
不要更改压缩响应的 ETag。这在 2.4.0 之前是默认设置,但不能满足 HTTP/1.1 属性,即同一资源的所有表示都具有唯一的 ETag。
从压缩响应中删除 ETag 标头。这会阻止某些条件请求,但会避免上述选项的缺点。
描述 | zlib 每次压缩的片段大小 |
---|---|
语法 | DeflateBufferSize value |
默认值 | DeflateBufferSize 8096 |
上下文 | 服务器配置,虚拟主机 |
状态 | 扩展 |
模块 | mod_deflate |
指令指定 zlib 每次压缩的片段大小(以字节为单位)。如果压缩响应大小大于此指令指定的大小,则 httpd 将切换到分块编码(HTTP 标头 DeflateBufferSize
Transfer-Encoding
设置为 Chunked
),其副作用是不设置任何 Content-Length
HTTP 标头。这在 httpd 在反向缓存代理后面运行时或 httpd 配置了
和 mod_cache
时尤其重要,因为没有 mod_cache_disk
Content-Length
标头的 HTTP 响应可能无法被缓存。
描述 | 我们对输出应用多少压缩 |
---|---|
语法 | DeflateCompressionLevel value |
默认值 | Zlib 的默认值 |
上下文 | 服务器配置,虚拟主机 |
状态 | 扩展 |
模块 | mod_deflate |
指令指定应使用哪种压缩级别,值越高,压缩效果越好,但实现此压缩所需的 CPU 时间也越多。DeflateCompressionLevel
该值必须介于 1(压缩较少)和 9(压缩更多)之间。
描述 | 将压缩率放在日志记录的注释中 |
---|---|
语法 | 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
描述 | 膨胀的请求主体的最大大小 |
---|---|
语法 | DeflateInflateLimitRequestBody value |
默认值 | 无,但 LimitRequestBody 在解压缩后应用 |
上下文 | 服务器配置,虚拟主机,目录,.htaccess |
状态 | 扩展 |
模块 | mod_deflate |
兼容性 | 2.4.10 及更高版本 |
指令 DeflateInflateLimitRequestBody
指定了解压缩后的请求主体最大尺寸。如果未设置,则 LimitRequestBody
将应用于解压缩后的主体。
描述 | 请求主体解压缩比率可以超过的最大次数 |
---|---|
语法 | DeflateInflateRatioBurst value |
默认值 | DeflateInflateRatioBurst 3 |
上下文 | 服务器配置,虚拟主机,目录,.htaccess |
状态 | 扩展 |
模块 | mod_deflate |
兼容性 | 2.4.10 及更高版本 |
指令 DeflateInflateRatioBurst
指定了在终止请求之前,可以超过 DeflateInflateRatioLimit
的最大次数。
描述 | 请求主体最大解压缩比率 |
---|---|
语法 | DeflateInflateRatioLimit value |
默认值 | DeflateInflateRatioLimit 200 |
上下文 | 服务器配置,虚拟主机,目录,.htaccess |
状态 | 扩展 |
模块 | mod_deflate |
兼容性 | 2.4.10 及更高版本 |
指令 DeflateInflateRatioLimit
指定了解压缩后的请求主体,压缩前大小与解压缩后大小的最大比率。此比率在主体流式传输时进行检查,如果超过 DeflateInflateRatioBurst
次,则请求将被终止。