这个问题类似于排除 Nginx 中记录的特定查询参数?但对于多个参数。我想要做的是混淆全部我指定的查询参数存在于请求 URI 中。例如,假设我有以下请求:
GET /index.html?latitude=55.70&longitude=32.2341&otherkey=value HTTP/1.1
那么我想要两者latitude
和 longitude
在日志中进行混淆:
GET /index.html?latitude=***&longitude=***&otherkey=value HTTP/1.1
如果我尝试像这样定义日志格式:
log_format main '$remote_addr - $remote_user [$time_local] $host "$customrequest" '
'$status $body_bytes_sent $request_time "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
map $request $customrequest {
~^(.*)([\?&]latitude=|longitude=)([^&]*)(.*)$ "$1$2***$4";
default $request;
}
那么只考虑正则表达式中的最后一个参数,结果将是:
GET /index.html?latitude=55.70&longitude=***&otherkey=value HTTP/1.1
即不是我想要的是。
所以问题是,我该如何配置 Nginx 来混淆全部我已经定义的给定 (query/uri) 参数?
我正在使用 Nginx 1.19.5。
答案1
您可以级联map
语句。这可能不是很高效,但很容易扩展。此外,您将需要使用命名捕获,因为数字捕获将被覆盖。
例如:
map $request $custom1 {
~^(?<prefix1>.*[\?&]latitude=)([^&]*)(?<suffix1>.*)$ "${prefix1}***$suffix1";
default $request;
}
map $custom1 $customrequest {
~^(?<prefix2>.*[\?&]longitude=)([^&]*)(?<suffix2>.*)$ "${prefix2}***$suffix2";
default $custom1;
}