最可靠方式是用 map + gzip_disable 实现路径级禁用:定义 map 将目标 URI 映射为非空字符串,gzip_disable 引用该变量即可禁用压缩,避免正则 location 中 gzip off 被忽略的问题。

要为特定动态接口(比如 /api/v1/export 或带查询参数的路径)在 Nginx 中真正关闭 Gzip 压缩,不能依赖 location ~ ... { gzip off; } —— 因为正则 location 中的 gzip off 在大多数情况下会被忽略。
用 map + gzip_disable 实现路径级禁用
这是最可靠、官方支持的方式。Nginx 的 gzip_disable 指令本用于匹配 User-Agent,但它接受变量值;只要变量非空,就会跳过压缩。
- 定义一个
map,将目标 URI 映射为非空字符串(如"1") -
gzip_disable引用该变量,Nginx 就会在匹配时自动禁用压缩 - 该方法不依赖 location 优先级,也不受正则作用域限制
示例配置:
~^/api/v1/export "1";
~^/api/v2/download "1";
default "";
}
gzip_disable $no_gzip_api;
注意变量值必须非空
gzip_disable 只检测变量是否“有值”,不校验内容。空字符串("")视为启用压缩,任意非空值("1"、"off"、"true")都有效。
- 避免写成
default "1",否则所有请求都会被禁用压缩 - 正则表达式需用
~^开头确保精确匹配路径起始位置 - 多个接口可共用一个 map,提高可维护性
不推荐的替代方案
直接在 location 块中写 gzip off 对动态路径基本无效:
-
location ~ /api/.*export属于正则匹配,gzip off被忽略 -
if ($args ~ token=)内部无法使用gzip off -
gzip_proxied仅影响代理响应,对直连 PHP-FPM 的接口无作用
验证是否生效
配置后必须实测响应头:
- 运行
curl -I https://example.com/api/v1/export?token=abc - 确认返回中不含
Content-Encoding: gzip - 对比响应体大小(
curl -s URL | wc -c),确保无额外压缩开销


















