要在 nginx access_log 中记录标准化的 content-encoding,需用 map 指令将 $http_content_encoding 映射为统一变量 $req_enc(如 gzip/br/deflate/identity),再将其加入 log_format 并在 location 中启用,最后通过 nginx -t 和 -s reload 验证生效。

要在 Nginx 的 access_log 中记录请求的传输编码类型(即 Content-Encoding 请求头),关键不是直接记录原始头值,而是通过 map 指令安全提取并标准化该字段,再将其注入日志格式。因为 $http_content_encoding 变量虽可读取该头,但其值大小写不一、可能为空或含非法字符,直接写入日志易导致格式错乱或解析失败。
在 http 块中定义标准化编码变量
必须将 map 块置于 http{...} 作用域内,用于将原始 Content-Encoding 头映射为统一、安全的变量:
- 使用
~*正则实现忽略大小写的匹配,覆盖gzip、br、deflate等常见拼写 - 未匹配时设为
identity,表示无压缩或明文传输 - 该变量(如
$req_enc)后续可在日志中直接引用
示例配置:
map $http_content_encoding $req_enc {~*[Gg][Zz][Ii][Pp] gzip;
~*[Bb][Rr] br;
~*[Dd][Ee][Ff][Ll][Aa][Tt][Ee] deflate;
default identity;
}
扩展 log_format 并引用编码变量
在同一个 http 块中,定义新的日志格式,把 $req_enc 加入其中。注意:避免直接用 $http_content_encoding,以防空值或特殊字符破坏日志结构。
- 推荐放在已有格式(如
main)基础上增强,例如新增enc:"$req_enc" - 可同时加入
$request_time或$upstream_response_time,便于关联分析压缩对性能的影响
示例:
log_format enhanced '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" enc:"$req_enc" req_time:$request_time;'
在 server 或 location 中启用增强日志
只需在目标作用域中指定 access_log 使用新格式即可,无需额外模块或编译选项:
- 若只想记录 API 接口的编码信息,放在
location /api/ { ... }内最精准 - 路径建议用绝对路径,如
/var/log/nginx/encoding.log - 可叠加
buffer=32k减少 I/O 频次,或gzip=6节省磁盘空间
示例:
location /api/ {access_log /var/log/nginx/encoding.log enhanced buffer=32k;
proxy_pass http://backend;
}
验证与注意事项
配置生效前务必验证语法并重载:
- 运行
nginx -t确保无语法错误 - 执行
nginx -s reload应用变更 - 发送带不同
Content-Encoding的请求(如curl -H "Content-Encoding: gzip" ...),检查日志是否输出对应enc:"gzip" -
map不会解压请求体,仅作标识用途;如需实际处理压缩请求,请配合if或后端逻辑











