排除 Nginx 中记录的多个查询参数?

排除 Nginx 中记录的多个查询参数?

这个问题类似于排除 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;
}

相关内容