Apache HTTP Server 版本 2.4
描述 | 在内容传递给客户端之前,使用 Brotli 压缩内容 |
---|---|
状态 | 扩展 |
模块标识符 | brotli_module |
源文件 | mod_brotli.c |
兼容性 | 在版本 2.4.26 及更高版本中可用。 |
模块提供 mod_brotli
BROTLI_COMPRESS
输出过滤器,允许在通过网络将服务器输出发送到客户端之前,使用 brotli 压缩格式压缩输出。此模块使用 Brotli 库,可在 https://github.com/google/brotli 找到。
当 TLS 连接传输压缩数据时,某些 Web 应用程序容易受到信息泄露攻击。有关更多信息,请查看“BREACH”系列攻击的详细信息。
这是一个简单的配置,它压缩常见的基于文本的内容类型。
AddOutputFilterByType BROTLI_COMPRESS text/html text/plain text/xml text/css text/javascript application/javascript
当 TLS 连接传输压缩数据时,某些 Web 应用程序容易受到信息泄露攻击。有关更多信息,请查看“BREACH”系列攻击的详细信息。
压缩由 BROTLI_COMPRESS
过滤器 实现。以下指令将为放置它的容器中的文档启用压缩
SetOutputFilter BROTLI_COMPRESS SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png)$ no-brotli
如果您想将压缩限制为一般情况下特定 MIME 类型,可以使用
指令。以下是如何仅为 Apache 文档的 html 文件启用压缩的示例AddOutputFilterByType
<Directory "/your-server-root/manual"> AddOutputFilterByType BROTLI_COMPRESS text/html </Directory>
BROTLI_COMPRESS
过滤器始终插入在 RESOURCE 过滤器(如 PHP 或 SSI)之后。它从不触及内部子请求。
模块发送 mod_brotli
Vary: Accept-Encoding
HTTP 响应头以提醒代理,缓存的响应应仅发送给发送适当 Accept-Encoding
请求头的客户端。这可以防止将压缩内容发送到无法理解它的客户端。
如果您使用一些依赖于例如 User-Agent
头部的特殊排除,则必须手动配置对 Vary
头部的添加以提醒代理有关其他限制。例如,在典型的配置中,BROTLI_COMPRESS
过滤器的添加取决于 User-Agent
,您应该添加
Header append Vary User-Agent
如果您的压缩决策取决于除请求头之外的其他信息(例如 HTTP 版本),则必须将 Vary
头部设置为 *
值。这会阻止符合标准的代理完全缓存。
Header set Vary *
由于
在每次发出请求时都会重新压缩内容,因此可以通过预压缩内容并告诉 mod_brotli 在不重新压缩的情况下提供它们来获得一些性能优势。这可以通过以下配置来实现mod_brotli
<IfModule mod_headers.c> # Serve brotli compressed CSS files if they exist # and the client accepts brotli. RewriteCond "%{HTTP:Accept-encoding}" "br" RewriteCond "%{REQUEST_FILENAME}\.br" "-s" RewriteRule "^(.*)\.css" "$1\.css\.br" [QSA] # Serve brotli compressed JS files if they exist # and the client accepts brotli. RewriteCond "%{HTTP:Accept-encoding}" "br" RewriteCond "%{REQUEST_FILENAME}\.br" "-s" RewriteRule "^(.*)\.js" "$1\.js\.br" [QSA] # Serve correct content types, and prevent double compression. RewriteRule "\.css\.br$" "-" [T=text/css,E=no-brotli:1] RewriteRule "\.js\.br$" "-" [T=text/javascript,E=no-brotli:1] <FilesMatch "(\.js\.br|\.css\.br)$"> # Serve correct encoding type. Header append Content-Encoding br # Force proxies to cache brotli & # non-brotli css/js files separately. Header append Vary Accept-Encoding </FilesMatch> </IfModule>
描述 | 压缩期间应如何修改传出的 ETag 头部 |
---|---|
语法 | BrotliAlterETag AddSuffix|NoChange|Remove |
默认值 | BrotliAlterETag AddSuffix |
上下文 | 服务器配置,虚拟主机 |
状态 | 扩展 |
模块 | mod_brotli |
指令指定在压缩响应时应如何更改 ETag 头部。BrotliAlterETag
将压缩方法附加到 ETag 的末尾,导致压缩和未压缩表示具有唯一的 ETag。在另一个动态压缩模块 mod_deflate 中,这是自 2.4.0 以来默认值。此设置可以防止向压缩内容的条件请求提供“HTTP 未修改”(304)响应。
不要更改压缩响应的 ETag。在另一个动态压缩模块 mod_deflate 中,这是在 2.4.0 之前的默认值。此设置不满足 HTTP/1.1 属性,即同一资源的所有表示都具有唯一的 ETag。
从压缩响应中删除 ETag 头部。这会阻止一些条件请求变得可能,但会避免前面选项的缺点。
描述 | 最大输入块大小 |
---|---|
语法 | BrotliCompressionMaxInputBlock value |
默认值 | (自动) |
上下文 | 服务器配置,虚拟主机 |
状态 | 扩展 |
模块 | mod_brotli |
指令指定 16 到 24 之间的最大输入块大小,但需要注意的是,较大的块大小需要更多内存。BrotliCompressionMaxInputBlock
描述 | 压缩质量 |
---|---|
语法 | BrotliCompressionQuality value |
默认值 | BrotliCompressionQuality 5 |
上下文 | 服务器配置,虚拟主机 |
状态 | 扩展 |
模块 | mod_brotli |
指令指定压缩质量(0 到 11 之间的值)。较高的质量值会导致更好的压缩,但也更慢。BrotliCompressionQuality
描述 | Brotli 滑动压缩窗口大小 |
---|---|
语法 | BrotliCompressionWindow value |
默认值 | BrotliCompressionWindow 18 |
上下文 | 服务器配置,虚拟主机 |
状态 | 扩展 |
模块 | mod_brotli |
指令指定 brotli 滑动压缩窗口大小(10 到 24 之间的值)。较大的窗口大小可以提高压缩质量,但需要更多内存。BrotliCompressionWindow
描述 | 将压缩率放在日志记录的注释中 |
---|---|
语法 | BrotliFilterNote [type] notename |
上下文 | 服务器配置,虚拟主机 |
状态 | 扩展 |
模块 | mod_brotli |
指令指定应将有关压缩率的注释附加到请求。注释的名称是为指令指定的值。您可以通过将该值添加到 访问日志 中来将该注释用于统计目的。BrotliFilterNote
BrotliFilterNote ratio LogFormat '"%r" %b (%{ratio}n) "%{User-agent}i"' brotli CustomLog "logs/brotli_log" brotli
如果您想从日志中提取更准确的值,可以使用 type 参数指定作为日志记录注释留下的数据类型。 type 可以是以下之一
Input
Output
Ratio
output/input * 100
)存储在注释中。这是默认值,如果省略了 type 参数。因此,您可以这样记录它
BrotliFilterNote Input instream BrotliFilterNote Output outstream BrotliFilterNote Ratio ratio LogFormat '"%r" %{outstream}n/%{instream}n (%{ratio}n%%)' brotli CustomLog "logs/brotli_log" brotli