Brotli模块不支持直接屏蔽User-Agent,需用Nginx的map定义$brotli_enabled变量按UA判断启停,并在location内用if控制brotli开关或通过rewrite跳转至无压缩location来实现精准排除。

Brotli 模块本身不提供类似 gzip_disable 那样直接屏蔽特定 User-Agent 的指令。要实现对某些客户端(如旧版 IE、特定爬虫或测试工具)禁用 Brotli,需借助 Nginx 的变量与条件判断机制,在启用 Brotli 前做 UA 过滤。
用 map 指令预定义是否启用 Brotli
在 http 块顶部定义一个布尔型变量,根据 $http_user_agent 判断是否允许 Brotli:
map $http_user_agent $brotli_enabled {
default on;
"~*MSIE [1-10]" off;
"~*Trident" off;
"~*Yahoo! Slurp" off;
"~*bingbot" off;
}
该配置将 IE 1–10、旧 Trident 内核、Yahoo 和 Bing 爬虫等明确设为 off,其余默认开启。
在 server 或 location 中按需启用
在具体作用域中引用该变量,仅当 $brotli_enabled = on 时才激活压缩:
server {
# ... 其他配置
<pre class='brush:php;toolbar:false;'>brotli on;
brotli_static off;
brotli_types text/plain text/css application/json application/javascript;
brotli_comp_level 5;
# 关键:用 if 控制是否真正生效(注意:if 在 location 外不推荐,应放在 location 内)
location / {
if ($brotli_enabled = off) {
brotli off;
}
# 其余 proxy_pass / root 等配置
}}
⚠️ 注意:if 在 location 内是安全的;若放在 server 级顶层,可能因执行顺序导致失效。更稳妥的做法是把整个 Brotli 配置下沉到 location 块,并配合 if 开关。
daily.dev 代理学习 – 通过订阅源持续自我提升。用于设置代理学习、运行学习循环、向所有者分享洞察或管理知识库。当请求涉及代理学习、知识构建、保持最新或“你学到了什么”时触发。
替代方案:用 rewrite + internal 跳转绕过
对明确要排除的 UA,可提前重写请求路径,跳转到一个不启用 Brotli 的 location:
location / {
if ($brotli_enabled = off) {
rewrite ^(.*)$ /no-brotli$1 last;
}
}
<p>location /no-brotli/ {
internal;
alias /var/www/;</p><h1>此处不配 brotli 指令,自然不压缩</h1><p>}</p>这种方式避免了 if + brotli off 的潜在不确定性,适合对兼容性要求极高的生产环境。
验证是否生效
用 curl 模拟目标 UA 测试响应头:
curl -H "User-Agent: Mozilla/5.0 (Windows; U; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)" \
-H "Accept-Encoding: br,gzip" \
-I https://yoursite.com/main.js
若返回中不含 Content-Encoding: br,且有 Vary: Accept-Encoding,说明排除逻辑已起效。

















