Brotli对静态响应实现深度压缩需精准配置brotli_types:必含text/html、text/css、application/javascript、application/json、image/svg+xml;排除image/、font/等已压缩格式;设brotli_min_length 256并配合brotli_static on/always,最后用curl -H "Accept-Encoding: br"验证Content-Encoding: br。

要让 Brotli 对静态响应实现深度、无损且真正节省带宽的效果,brotli_types 不是“多写几个类型”就行,而是必须精准覆盖实际传输的文本类资源,同时严格排除已压缩或不受益格式——否则不仅白压,还可能触发错误协商或缓存混乱。
只列真正需要压缩的 MIME 类型
静态资源中只有纯文本内容才能从 Brotli 的上下文建模和静态字典中获益。以下为经实测验证的核心组合(Nginx 配置写法):
- text/html:必须包含,尤其 PHP 渲染的 HTML 或 SSR 页面;漏掉会导致首页完全绕过 Brotli
- text/css 和 application/javascript:前端静态资产主力,压缩收益最显著
- application/json:API 响应、配置文件、i18n 数据等,小体积但高频,-q 4 即可高效压缩
- image/svg+xml:SVG 是 XML 文本,未压缩时体积常达数 KB,Brotli 可再压 30%+,不可忽略
- text/xml、application/xml+rss:仅当站点提供 RSS/Atom 等 XML 输出时才加入
务必排除:image/*(PNG/JPEG/WebP 已有损压缩)、font/*(WOFF2 内置压缩)、application/octet-stream(二进制泛用类型,易误压)。
避免常见误配陷阱
- 不加 application/x-httpd-php:这是 PHP-FPM 动态响应类型,不属于“静态响应”范畴;静态资源由 Nginx 直接服务,走的是文件后缀匹配逻辑
- 不写 * 或 ~.*:通配符会命中二进制资源,导致 Nginx 尝试对图片、PDF 等执行 Brotli 编码,失败时返回 500 或降级为明文,极难排查
- 不混用 gzip_types 和 brotli_types:若共存 Gzip,二者类型列表不必一致;Brotli 应专注高价值文本,Gzip 只留 text/plain 作兜底即可
配合最小长度与静态优先策略
brotli_min_length 256 是关键安全阈值:低于该值的响应(如空 JSON、304、短重定向体)不压缩,避免 CPU 白耗和首字节延迟增加。
搭配 brotli_static on 或 always(推荐后者)时,Nginx 会先查找同名 .br 文件;此时 brotli_types 决定“哪些后缀的文件值得预生成 .br”——例如你写了 text/css,就要确保所有 .css 文件都构建了 .css.br,否则 fallback 动态压缩仍依赖此配置生效。
验证是否真正生效
用 curl 检查真实响应头:
curl -H "Accept-Encoding: br" -I https://yoursite.com/app.js
成功时应看到:Content-Encoding: br 且 Vary: Accept-Encoding;若返回 Content-Encoding: gzip 或无编码头,说明 brotli_types 没匹配上,或客户端请求头未带 br,或 .br 文件缺失/权限错误。

















