nginx 的 gzip_types 仅依据响应头 Content-Type 字段匹配,不识别文件后缀;自定义 MIME 类型需显式列入配置,且严格区分大小写、忽略 charset 参数与引号,须通过 curl -I 验证实际返回类型及 Content-Encoding: gzip 是否生效。

nginx 的 gzip_types 不认文件后缀,也不管你叫它 app.js 还是 data.json,它只看响应头里的 Content-Type 字段。所以,只要后端返回的响应带了正确的 MIME 类型,哪怕这个类型是你自定义的(比如 application/vnd.myapp.config+json),也能被 gzip 压缩——前提是它被明确写进 gzip_types 列表里。
自定义 Content-Type 必须显式加入 gzip_types
nginx 不支持通配符或模糊匹配,也不解析 charset 参数。例如:
- 后端返回
Content-Type: application/vnd.api+json→ 配置里就得写application/vnd.api+json - 返回
Content-Type: text/x-config; charset=utf-8→ nginx 只匹配text/x-config,忽略; charset=utf-8部分 - 若配置的是
application/json,而响应头是application/vnd.myapp+json,则不会压缩
确保 MIME 映射与响应头完全一致
很多自定义类型依赖 mime.types 文件或 types 块定义。如果 Nginx 没把你的扩展名映射到对应 MIME 类型,后端即使返回静态文件,也可能默认用 application/octet-stream 或 text/plain,导致压缩失效。
- 检查
conf/mime.types是否包含你的类型,例如:application/vnd.myapp.config+json jsonc; - 或在 server/http 块中手动补充:
types { application/vnd.myapp.data+json data; } - 用
curl -I确认实际返回的Content-Type值,再据此配置gzip_types
避免常见陷阱:大小写、空格与分号
gzip_types 匹配严格区分大小写,且不处理首尾空格或参数部分:
- ✅ 正确:
gzip_types application/vnd.api+json text/x-yaml; - ❌ 无效:
gzip_types Application/vnd.api+json(大写 A) - ❌ 无效:
gzip_types "application/vnd.api+json"(引号会被当字面量) - ❌ 无效:
gzip_types application/vnd.api+json;charset=utf-8(含参数)
验证是否生效的可靠方式
别只看配置有没有语法错误,要实测响应头:
- 终端执行:
curl -H "Accept-Encoding: gzip" -I https://yoursite.com/api/config - 确认返回头含
Content-Encoding: gzip且Content-Type与你配置的一致 - 浏览器开发者工具 Network 标签页中,查看该请求的响应头和传输大小变化


















