Apache HTTP Server 版本 2.4

| 描述 | 在内容传递给客户端之前,使用 Brotli 压缩内容 |
|---|---|
| 状态 | 扩展 |
| 模块标识符 | brotli_module |
| 源文件 | mod_brotli.c |
| 兼容性 | 在版本 2.4.26 及更高版本中可用。 |
模块提供 mod_brotliBROTLI_COMPRESS 输出过滤器,允许在通过网络将服务器输出发送到客户端之前,使用 brotli 压缩格式压缩输出。此模块使用 Brotli 库,可在 https://github.com/google/brotli 找到。

BrotliAlterETag
BrotliCompressionMaxInputBlock
BrotliCompressionQuality
BrotliCompressionWindow
BrotliFilterNote当 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_brotliVary: 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 可以是以下之一
InputOutputRatiooutput/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