map指令通过正则匹配$uri或$request_uri实现路径脱敏与业务归类:提取稳定前缀映射为service标签(如/order)、掩码动态ID为*、组合变量生成分目录日志、脱敏敏感查询参数(如token),统一支撑日志分析与安全合规。

用 map 指令对请求路径做脱敏或归类,核心是把杂乱的 `$request_uri` 或 `$uri` 映射成简洁、可读、带业务语义的标签,既保护接口细节,又支撑日志分析和监控归因。
提取业务线/模块名,实现路径归类
真实请求路径往往携带大量动态参数或ID(如 /api/v2/order/123456789/items?limit=20),直接记录不利于聚合统计。可用 map 从路径中提取稳定前缀,映射为统一业务标识:
- 定义在
http块顶层:
map $uri $log_service {
~^/api/v1/user/ user;
~^/api/v1/order/ order;
~^/api/v1/pay/ pay;
~^/admin/api/ admin;
default unknown;
}- 该配置不依赖参数,只看路径开头;正则匹配优先级从上到下,第一个命中即生效
- 归类后可在
log_format中直接引用$log_service,例如:log_format main '$remote_addr [$time_local] $log_service "$request_method $uri" $status';
掩码动态ID段,保留结构不暴露敏感值
有些路径中嵌入了用户ID、订单号等不可推导但需脱敏的字段(如 /user/889900123/profile)。可用 map 替换具体数字为占位符,兼顾可读性与合规性:
- 写法示例(支持多级路径):
map $uri $sanitized_uri {
default $uri;
~^(/[^/]+)/\d{6,12}(/.*|$) "$1/***$2";
~^(/[^/]+)/[a-zA-Z0-9]{8,16}(/.*|$) "$1/***$2";
}- 第一行匹配形如
/user/123456789/settings→ 转为/user/***/settings - 第二行适配 UUID 类路径(如
/order/a1b2c3d4-e5f6-7890-g1h2-i3j4k5l6m7n8) - 注意:正则中用
.*匹配后续任意内容,避免截断查询参数
组合维度生成层级日志路径,便于切割与归档
将归类变量与时间、环境等结合,直接用于 access_log 路径,实现“日志即维度”:
- 例如,按业务线 + 当天日期分目录:
map $uri $log_service {
~^/api/v1/order/ order;
~^/api/v1/user/ user;
default other;
}
<h1>在 server 块中使用:</h1><p>access_log /var/log/nginx/${log_service}/$(date +%Y%m%d).log main;- 实际部署时需配合 logrotate 的通配符轮转(如
/var/log/nginx/*/2026*.log) - Nginx 不解析
$(date),此处仅为示意;生产中常用脚本预创建目录,或借助外部工具(如 cron + mkdir) - 更稳妥做法是用内置变量拼接静态路径,如:
/var/log/nginx/$log_service/access.log,再由 logrotate 按日切分
处理带查询参数的路径脱敏(如含 token 的回调地址)
部分请求路径本身携带敏感参数(如 /callback?token=abc123&uid=98765),此时仅靠 `$uri` 不够,需联动 `$args` 或 `$request_uri`:
- 推荐分离处理:先用 map 对 `$request_uri` 做整体掩码,再在 log_format 中引用
- 示例(隐藏 token 和 uid 参数):
map $request_uri $sanitized_request_uri {
default $request_uri;
~^(.*\?)(([^&]*&)*)(token|uid)=([^&\s]+)(&.*)?$ "$1***$6";
~^(.*\?)(([^&]*&)*)(token|uid)=([^&\s]+)$ "$1***";
}- 该规则优先匹配含
&的中间参数,再兜底结尾参数,避免破坏 URL 结构 - 结果如:
/callback?token=abc123&uid=98765→/callback?***

















