SEO 百科
Brotli
本页目录
Brotli
Brotli 是一种文本压缩算法,编码值写成 br,同一份内容比 gzip 压得更小,代价是要花更长时间[5]。浏览器在 Accept-Encoding 里带上 br,服务器选中它就在响应里写 Content-Encoding: br[4],收到的一侧照着这个值解压。它和 gzip 通常同时开着,各管一段场景。
编码值与 HTTPS 前提
Brotli 是一种较新的文本压缩算法,与 gzip 相比能提供更好的压缩效果[5]。它的编码值是 br,格式定义写在 RFC 7932 里[1]。浏览器发出请求时,几个编码值常常一起带上。
GET /main.bundle.js HTTP/1.1
Host: example.com
Accept-Encoding: gzip, deflate, br
浏览器支持不等于马上能用。Google 说明,要用 Brotli,服务器必须支持 HTTPS[5]。响应里带 Content-Encoding: br,收到的一侧按这个值解压,才能还原出原始的媒体类型[4]。
与 Gzip 的分工
同一份内容,Brotli 压出来更小。Google 的示例包里,gzip 把 225 KB 的 JavaScript 包压到 61.6 KB,brotli 压到 53.1 KB,再小约 14%[5]。另一组数字出自 CertSimple,JavaScript 比 gzip 小 14%,CSS 小 17%,HTML 小 21%[5]。这些数字只覆盖文档里的示例包和该站点的测试条件,换成别的站点要自己测一遍。
两种编码可以都开。请求里带 br 时按 Brotli 处理,不支持它的老浏览器会回到 gzip[5]。服务端送 .br 文件之前,先看 Accept-Encoding 里有没有 br,没有就按原始文件发[5]。
静态文本交给 Brotli
适合压的是文本那一类:HTML、CSS、JavaScript、JSON、SVG。已压过的格式不必再开,PNG、JPG 这类图片和 MP4 这类视频压不出收益[6]。
Brotli 的小体积要用更长的压缩过程换。请求时才动手压,这段耗时会落在访客的等待里,所以静态文本通常提前压好[5]。构建阶段把 main.js 输出成 main.js.br,响应头里写 Content-Encoding: br,媒体类型再补一行 Content-Type[5]。级别调高只是拉长构建时间,用户拿到的仍是压好的文件[5]。
流式响应留给 Gzip
边生成边送的场景里,gzip 仍是默认选项。动态压缩在浏览器请求资源时才动手,以更高级别换取更高压缩比需要更长时间,用户要等压缩完毕才拿到响应[5]。服务端渲染的 HTML 与分段输出的接口在生成过程中就得开始传字节,这段等待省不掉。gzip 在这条链路上开得最早,阿里云说明它的压缩功能兼容所有浏览器[7],中间设备对它的处理也更一致,出问题的概率小。
部署方式
Apache 一侧由 mod_brotli 模块提供,从 2.4.26 版本起可用[3]。NGINX 开源版的核心不带这个模块,要另装第三方动态模块,配置可以落在 http、server 或 location 层[2]。自建服务器之外,CDN 产品把它做成一个开关,源站已经压过、响应带了 Content-Encoding 时,节点侧的 Brotli 不再生效[6],两头都开只是多配一份用不上的设置。
附录
参见
参考资料
官方(境外)
- 《Brotli Compressed Data Format》,IETF,2016-07。
- 《Brotli》,NGINX。
- 《Apache Module mod_brotli》,Apache HTTP Server Project。
- 《Content-Encoding》,MDN Web 文档,2025-07-04 更新。
- 《使用 brotli 缩减和压缩网络载荷》,web.dev。
官方(国内)
外部链接
无。