使用 Apache 提供的预压缩 .br(Brotli)文件时出现内容编码错误(ERR_CONTENT_DECODING_FAILED)

使用 Apache 提供的预压缩 .br(Brotli)文件时出现内容编码错误(ERR_CONTENT_DECODING_FAILED)

如何让 Apache 提供预压缩的 Brotli 文件?

使用 Chrome 我得到

净::ERR_CONTENT_DECODING_FAILED 200

我从最小化文件 ( ) 中制作了预压缩.br(Brotli) 文件。我使用了.html.min.html豌豆压缩(9.3.0)生成这些 Brotli 文件。这是我制作这些文件时所采用的过程。

我将它们并排托管 —— 全部位于同一目录中。命名约定如下filename.htmlfilename.min.htmlfilename.html.br

目前,我仍然希望这些文件可以用来预压缩 Apache (2.4) 服务器——按原样。

重写规则正在运行。我从https://sub.domain.com/v3/en/home/使用html/com___en___home.html.br

Alias "/v3/" "D:/www/v3/"
<Directory "D:/www/v3/">
    AddDefaultCharset UTF-8
    RewriteEngine On
    RewriteCond %{REQUEST_URI} ^/v3(.*) [NC]
    RewriteCond %{HTTP_HOST} ^([^.]+)\.([^.]+)\.([^.]+)?$ [NC]
    RewriteRule ^([^.]+)/([^.]+)/([^.]+)/$ html/%3___$1___$2___$3.html

    # Serve the Brotli-compressed HTML files from the "static_html" directory
    RewriteRule ^(.+)\.html$ $1.html.br [L,T=text/html,E=no-brotli,E=no-gzip]
</Directory>

.htaccess该目录中的文件有

AddType application/brotli .br
AddEncoding br .br

# Disable Gzip compression for .br files
<IfModule mod_deflate.c>
    SetEnvIfNoCase Request_URI "\.br$" no-gzip
</IfModule>

调用该页面时我得到了以下信息:

FireFox 内容编码错误

将我的文件更改.htaccess为此

AddType application/brotli .br
#AddEncoding br .br  <<< commented out

# Disable Gzip compression for .br files
<IfModule mod_deflate.c>
    SetEnvIfNoCase Request_URI "\.br$" no-gzip
</IfModule>

我明白了

字节流错误

以及 Firefox 备注

根据声明的字符编码,字节流有错误。字符编码声明可能不正确。

声明的字符编码和实际使用的字符编码显然不匹配。

在那个阶段我的返回标题是

HTTP/2 200 OK
date: Thu, 03 Aug 2023 13:40:54 GMT
server: Apache/2.4.39 (Win64) OpenSSL/1.1.1c PHP/8.1.10
strict-transport-security: max-age=31536000; includeSubdomains;
last-modified: Mon, 31 Jul 2023 16:39:50 GMT
etag: "2904-601cb14402180"
accept-ranges: bytes
content-length: 10500
cache-control: max-age=0
expires: Thu, 03 Aug 2023 13:40:54 GMT
x-xss-protection: 1; mode=block;
referrer-policy: no-referrer-when-downgrade
access-control-allow-methods: POST,GET,HEAD
vary: Origin
content-security-policy: default-src 'self' (removed content);
x-content-type-options: nosniff
content-type: text/html; charset=UTF-8
X-Firefox-Spdy: h2

这些是 ChartGTP 建议我做的事情(由于我使用的是 Windows 设置,因此有些不相关。)

如果您在 Apache 服务器上提供预压缩的 Brotli 文件时遇到“内容编码错误”,则需要考虑以下几个潜在原因和解决方案:

  1. 确保 Brotli 模块已启用:验证mod_brotli您的 Apache 服务器中是否已启用该模块。确保您的 Apache 配置中有以下行来加载 Brotli 模块:
LoadModule brotli_module modules/mod_brotli.so

如果未加载模块,请使用适当的命令启用它(例如sudo a2enmod brotli在 Debian/Ubuntu 或sudo systemctl enable brotli在 CentOS/Fedora 上)。

这没什么意义;因为这些是预压缩文件。我确实启用了它。

  1. 检查 Brotli MIME 类型:确保您在 Apache 配置中设置了正确的 Brotli MIME 类型。添加以下行:
AddType application/brotli .br

这告诉 Apache 将“.br”扩展名与 Brotli 压缩文件关联。

  1. 验证 Brotli 压缩:确保 Brotli 压缩正常工作且文件已正确压缩。如果您使用工具或脚本预压缩文件,请仔细检查它是否生成有效的 Brotli 压缩文件。

第三项仍然在我的待办事项清单上。

  1. 文件权限:检查预压缩的 Brotli 文件的文件权限。确保它们具有由 Apache 提供服务所需的权限。

  2. Content-Length 标头:确保Content-Length在预压缩 Brotli 文件的响应中正确设置标头。此标头缺失或值不正确可能会导致内容传送问题。

第 5 点我没调查过。

  1. Content-Encoding 标头:确认Content-EncodingBrotli 压缩文件的标头在响应标头中设置为“br”。如果标头缺失或设置为其他值,可能会导致“内容编码错误”。

如果我将标题设置为 Brotli,AddEncoding br .br我会得到上面提到的内容编码错误。

我尝试AddEncoding hello .br并得到了这个输出:

你好测试

所以我需要将其设置为AddEncoding br .br-- 但这会出现内容编码错误。

  1. 清除浏览器缓存:如果您最近更改了服务器的配置或 Brotli 压缩,请清除浏览器的缓存以确保检索到更新的设置。

  2. 检查是否存在冲突的压缩方法:确保不与其他可能干扰 Brotli 压缩的压缩方法(例如 Gzip)发生冲突。如果还启用了 Gzip,请检查内容协商是否正确。

禁用

# Disable Gzip compression for .br files
<IfModule mod_deflate.c>
    SetEnvIfNoCase Request_URI "\.br$" no-gzip
</IfModule>
  1. 检查服务器日志:查看 Apache 服务器日志,尤其是错误日志,查找任何可能提供更多问题见解的相关错误消息。实施这些检查和潜在解决方案后,重新启动 Apache 服务器以应用更改。如果问题仍然存在,请查阅 Apache 文档并考虑向相关社区或论坛寻求帮助,以进一步帮助您解决所面临的特定问题。

我的日志文件记录

IP - - [02/Aug/2023:22:09:35 -0700] "GET /v3/en/home/ HTTP/2.0" 200 10500

感谢您的帮助。

答案1

我发现使用 PeaZip UI 手动创建的 Brotli 文件不会导致此编码问题。

起初我使用更强的压缩,--large_window=27移除它就可以让它工作。这是有效的:

Brotli_command = """C:\Program Files\PeaZip\res\bin\brotli\brotli.exe"" -9 " & _
  " """ & f_min_html & """ -o """ & f_html_br & """"

答案2

相关内容