複数のクエリパラメータを 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を難読化するにはどうしたらいいかということです全て私が定義した特定の (クエリ/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;
}

関連情報