Fiber默认不支持Brotli压缩,因其底层FastHTTP仅原生支持gzip和zstd,未内置brotli编码逻辑,也无fasthttp.Brotli常量;需手动集成github.com/andybalholm/brotli库,检查Accept-Encoding头、包裹响应体、设置Content-Encoding: br及Vary头,并注意HTTPS限制与静态文件协商缺失问题。

为什么 Fiber 默认不支持 Brotli 压缩
Fiber 是基于 FastHTTP 的 Go Web 框架,而 FastHTTP 本身不内置 Brotli 支持——它只原生支持 gzip 和 zstd(v1.50+)。brotli 不在标准压缩列表里,也没有 fasthttp.Brotli 这样的导出常量或封装函数。所以直接调用 ctx.SendFile() 或启用 fiber.Compression() 中间件,永远得不到 Content-Encoding: br 响应。
如何让 Fiber 返回 Brotli 压缩响应
必须手动注入 Brotli 编码逻辑:先用第三方库(如 github.com/andybalholm/brotli)压缩响应体,再设置响应头。关键不是“开启开关”,而是接管 ctx.Response().BodyWriter() 或预压缩内容。
- 用
github.com/andybalholm/brotli(纯 Go 实现,无 CGO,推荐)创建brotli.Writer - 检查请求头:
ctx.Get("Accept-Encoding")是否包含br,且协议为 HTTPS(HTTP 下浏览器根本不会发br) - 若满足条件,用
brotli.Writer包裹原始响应体,再写入内容;否则走默认路径 - 务必设置:
ctx.Response().Header.Set("Content-Encoding", "br")和ctx.Response().Header.Add("Vary", "Accept-Encoding") - 注意:不能对已设置
Content-Length的响应再压缩,需清空或延迟计算(FastHTTP 不自动重算)
Fiber 静态文件 + .br 文件怎么配合使用
Fiber 的 fiber.Static() 不识别 .br 文件,也不会根据 Accept-Encoding 自动选 index.html.br。它不像 Nginx 的 brotli_static on 那样有静态文件协商机制。
- 必须自己实现
fiber.Handler替代fiber.Static() - 在 handler 中读取
ctx.Path(),尝试打开path + ".br",并验证Accept-Encoding含br - 若命中,用
os.Open()打开 .br 文件,设置Content-Encoding: br和对应Content-Type(从扩展名推断) - 别忘了设置
Last-Modified和ETag,否则缓存行为异常 - 构建时生成 .br 文件(如用
brotli -q 11 main.js),确保和原文件同目录、同名
容易被忽略的 HTTPS 和客户端兼容性细节
Brotli 在 HTTP 明文连接下几乎必然失效——不是 Fiber 或 Go 的问题,而是浏览器策略:Chrome/Firefox/Edge 只在 HTTPS 下才在 Accept-Encoding 中发送 br。本地开发用 http://localhost 测试时,永远看不到 br 响应头。
- 用
curl -H "Accept-Encoding: br" https://yoursite.com/main.js验证,而非http:// - 检查响应头是否含
Content-Encoding: br,而不是只看文件后缀或日志 - 移动端 WebView(尤其旧版 Android System WebView)可能不支持 Brotli,降级到 gzip 是安全选择
- 如果同时用 Nginx 做反向代理,Brotli 应由 Nginx 处理(更成熟),Fiber 后端可关闭压缩,避免双重压缩或头冲突


















