Nginx 中Brotli压缩本身不参与请求拦截,真正的异常拦截靠if+return等机制实现:1.用map匹配非法Accept-Encoding值并403拒绝;2.对/favicon.ico等路径中含br的请求记录日志并限流;3.用自定义log_format统一记录启用Brotli的请求用于审计。

在 Nginx 中,Brotli 压缩本身由 ngx_brotli 模块提供(需手动编译或使用支持 Brotli 的发行版),它不直接参与请求拦截逻辑。真正能做“异常请求拦截 + 日志记录”的是 Nginx 的 if、return、log_not_found 或自定义日志条件等机制。Brotli 相关的“异常”通常指:客户端声明支持 Brotli(Accept-Encoding: br),但实际发送了损坏的 Brotli 编码请求体(如 POST 数据被错误压缩)、或试图绕过压缩策略发起恶意构造请求——但这类问题极少发生在 Brotli 解压层(Nginx 不解压请求体,只处理响应压缩)。
更常见、可落地的“Brotli 相关异常拦截”场景其实是:识别并拒绝那些滥用 Accept-Encoding 头、高频试探、非标准编码值、或携带可疑参数的请求,同时记录到独立日志文件。下面分三类实用做法说明:
1. 拦截非法或高危的 Accept-Encoding 值
Nginx 无法直接解析 Brotli 编码内容,但可以检查请求头中 Accept-Encoding 是否包含非法子串(如 br, gzip, xz, exec 中混入危险关键词)。用 map 预定义匹配规则,再结合 if 拒绝:
// 在 http 块中定义
map $http_accept_encoding $bad_encoding {
~*[xX][mM][lL] 1; # 拦截含 xml(常用于 XXE 尝试)
~*[eE][xX][eE][cC] 1; # 拦截 exec
~*br.*br.*br 1; # 过度重复 br(异常指纹)
~*[^a-zA-Z0-9,\s\-] 1; # 含非法字符(如控制符、路径遍历符号)
default 0;
}// 在 server 或 location 块中应用
if ($bad_encoding) {
access_log /var/log/nginx/brotli-abuse.log main;
return 403 "Invalid Accept-Encoding";
}2. 拦截无意义却开启 Brotli 的 HEAD/GET 请求(防扫描)
真实用户浏览器不会对纯静态资源(如 /favicon.ico、/robots.txt)主动加 br;若这些路径被带 Accept-Encoding: br 频繁访问,极可能是自动化工具扫描。可统一记录并限流:
- 用
location = /favicon.ico等精确匹配关键路径 - 配合
if ($http_accept_encoding ~* br)判断 - 写入专用日志:
access_log /var/log/nginx/brotli-scan.log main; - 返回 444(关闭连接,不发响应)或 403,并用
limit_req限制频率
3. 记录所有启用 Brotli 的请求(用于审计,非拦截)
如果目标是“统一记录”,而非拦截,推荐用 log_format 扩展字段,避免 if 性能损耗:
log_format brotli_log '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'"$http_accept_encoding" '
'$request_time '
'$upstream_http_content_encoding';
<p>server {
access_log /var/log/nginx/brotli-access.log brotli_log;
brotli on;
brotli_types text/plain text/css application/javascript application/json;
}这样所有成功启用 Brotli 压缩的响应都会带 Content-Encoding: br,日志中也能看到原始 Accept-Encoding 值,便于后续用脚本筛选异常模式(如 UA 为空 + br + 高频 404)。
注意:Nginx 的 if 在 location 外不推荐使用,务必放在 server 或 location 块内;return 会终止请求,适合拦截;而 access_log 指令在 if 内生效,只记录被匹配的请求。


















