如何让 Apache 提供预压缩的 Brotli 文件?
使用 Chrome 我得到
净::ERR_CONTENT_DECODING_FAILED 200
我从最小化文件 ( ) 中制作了预压缩.br
(Brotli) 文件。我使用了.html
.min.html
豌豆压缩(9.3.0)生成这些 Brotli 文件。这是我制作这些文件时所采用的过程。
我将它们并排托管 —— 全部位于同一目录中。命名约定如下filename.html
、filename.min.html
和filename.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>
调用该页面时我得到了以下信息:
将我的文件更改.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 文件时遇到“内容编码错误”,则需要考虑以下几个潜在原因和解决方案:
- 确保 Brotli 模块已启用:验证
mod_brotli
您的 Apache 服务器中是否已启用该模块。确保您的 Apache 配置中有以下行来加载 Brotli 模块:LoadModule brotli_module modules/mod_brotli.so
如果未加载模块,请使用适当的命令启用它(例如
sudo a2enmod brotli
在 Debian/Ubuntu 或sudo systemctl enable brotli
在 CentOS/Fedora 上)。
这没什么意义;因为这些是预压缩文件。我确实启用了它。
- 检查 Brotli MIME 类型:确保您在 Apache 配置中设置了正确的 Brotli MIME 类型。添加以下行:
AddType application/brotli .br
这告诉 Apache 将“.br”扩展名与 Brotli 压缩文件关联。
- 验证 Brotli 压缩:确保 Brotli 压缩正常工作且文件已正确压缩。如果您使用工具或脚本预压缩文件,请仔细检查它是否生成有效的 Brotli 压缩文件。
第三项仍然在我的待办事项清单上。
文件权限:检查预压缩的 Brotli 文件的文件权限。确保它们具有由 Apache 提供服务所需的权限。
Content-Length 标头:确保
Content-Length
在预压缩 Brotli 文件的响应中正确设置标头。此标头缺失或值不正确可能会导致内容传送问题。
第 5 点我没调查过。
- Content-Encoding 标头:确认
Content-Encoding
Brotli 压缩文件的标头在响应标头中设置为“br”。如果标头缺失或设置为其他值,可能会导致“内容编码错误”。
如果我将标题设置为 Brotli,AddEncoding br .br
我会得到上面提到的内容编码错误。
我尝试AddEncoding hello .br
并得到了这个输出:
所以我需要将其设置为AddEncoding br .br
-- 但这会出现内容编码错误。
清除浏览器缓存:如果您最近更改了服务器的配置或 Brotli 压缩,请清除浏览器的缓存以确保检索到更新的设置。
检查是否存在冲突的压缩方法:确保不与其他可能干扰 Brotli 压缩的压缩方法(例如 Gzip)发生冲突。如果还启用了 Gzip,请检查内容协商是否正确。
禁用
# Disable Gzip compression for .br files
<IfModule mod_deflate.c>
SetEnvIfNoCase Request_URI "\.br$" no-gzip
</IfModule>
- 检查服务器日志:查看 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
也许您必须通过 https 访问 .br。
https://groups.google.com/a/chromium.org/g/blink-dev/c/JufzX024oy0/m/LWEC-FJ7AwAJ