406错误主因是accept头与响应content-type或content-encoding不匹配,而非压缩算法冲突;需检查accept-encoding协商、vary头完整性、mime类型映射及bom干扰。

406 Not Acceptable 错误在启用 Gzip 和 Brotli 的 Nginx 环境中,通常不是压缩算法本身冲突所致,而是服务器响应头与实际内容不匹配、或 Accept 头协商失败引发的“内容不可接受”判定。关键在于:浏览器声明了它能接受的编码(如 Accept-Encoding: br,gzip),但服务器返回了不兼容的 Content-Encoding、错误的 MIME 类型,或未按协商结果提供对应格式资源。
检查 Accept-Encoding 协商是否被破坏
Nginx 默认支持协商,但若配置不当或中间层干扰,会导致浏览器收不到预期编码格式,从而触发 406。
- 用浏览器开发者工具 → Network 标签页,查看出错请求的 Request Headers 中是否有
Accept-Encoding: br,gzip,deflate;再看 Response Headers 中Content-Encoding是否为br或gzip,且值与请求头匹配 - 确认 Nginx 没有强制覆盖
Vary: Accept-Encoding—— 缺失该头会破坏缓存协商逻辑,某些 CDN 或代理可能删掉它,需显式保留:add_header Vary Accept-Encoding; - 若使用反向代理(如 Nginx 代理 Spring Boot/Tomcat),确保代理配置中透传编码能力:
proxy_set_header Accept-Encoding "";(清空后由 Nginx 主动协商)或proxy_pass_request_headers on;
避免 Content-Type 与压缩格式不兼容
406 常被误判为压缩问题,实则根源常是 MIME 类型不被客户端接受。例如前端发 Accept: application/json,后端却返回 text/html 响应体(哪怕已压缩),浏览器直接拒收。
- 检查出错响应的
Content-Type值是否在请求的Accept列表中。常见陷阱:Unity WebGL 构建包(.data/.wasm/.js)被 Nginx 错配为text/plain,而浏览器期望application/octet-stream或application/wasm - 在 Nginx 的
http或location块中显式设置类型映射:types { application/wasm wasm; application/javascript js; },并确保brotli_types和gzip_types包含这些 MIME 类型 - 禁用自动类型推断(尤其对无扩展名资源):
default_type application/octet-stream;可减少歧义
确保 Brotli 与 Gzip 不产生双重压缩或头冲突
ngx_brotli 模块设计为与 gzip 共存,但加载顺序和启用逻辑必须明确,否则可能造成响应头混乱(如同时带 Content-Encoding: br, gzip)。
- 确认只启用一种主压缩:Brotli 优先时,设
brotli on;并gzip off;;若需回退,保持gzip on;,但brotli on;必须存在——模块会自动按Accept-Encoding选择最优编码,不会叠加 - 验证模块加载顺序:运行
nginx -V 2>&1 | grep -E '(brotli|gzip)',确保输出含--add-module=../ngx_brotli和--with-http_gzip_static_module;若缺失,需重新编译 - 禁止静态文件压缩头污染:若启用了
gzip_static on;或brotli_static on;,确保对应预压缩文件(.gz/.br)真实存在且未损坏;否则 Nginx 可能返回空响应体 + 压缩头,直接触发 406
排查 UTF-8 BOM 或输出干扰导致的流损坏
BOM(EF BB BF)或 PHP 输出缓冲提前发送内容,会使压缩流起始字节错位,浏览器解码失败后可能降级报 406(尤其在某些旧版 Edge 或严格模式下)。
- 用命令行检查入口文件(如
index.php)是否含 BOM:head -c 3 index.php | xxd,输出ef bb bf即存在;用 VS Code 保存为 “UTF-8”(不含 BOM) - 若后端为 PHP,关闭
zlib.output_compression(php.ini),改由 Nginx 统一压缩;并确保无echo、print、空白符在<?php前输出 - 对 Unity WebGL 资源,禁用构建时的 “Decompression Fallback”,改用 Nginx 原生 Brotli/Gzip —— 回退模式生成的 .unityweb 文件与标准 br/gzip 不兼容,易被识别为非法编码











