
Diese Frage ähneltEinen bestimmten Abfrageparameter von der Protokollierung in Nginx ausschließen?aber für mehrere Parameter. Was ich tun möchte, ist zu verschleiernalleAbfrageparameter, die ich angebe und die in der Anforderungs-URI vorhanden sind. Nehmen wir beispielsweise an, ich habe die folgende Anforderung:
GET /index.html?latitude=55.70&longitude=32.2341&otherkey=value HTTP/1.1
dann hätte ich gerne beideslatitude
Und longitude
in den Protokollen verschleiert werden:
GET /index.html?latitude=***&longitude=***&otherkey=value HTTP/1.1
Wenn ich versuche, das Protokollformat wie folgt zu definieren:
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;
}
dann wird nur der letzte Parameter im regulären Ausdruck berücksichtigt und das Ergebnis ist:
GET /index.html?latitude=55.70&longitude=***&otherkey=value HTTP/1.1
welches istnichtwas ich möchte.
Die Frage ist also, wie kann ich Nginx so konfigurieren, dass es verschleiertalleder gegebenen (Abfrage/URI)-Parameter, die ich definiert habe?
Ich verwende Nginx 1.19.5.
Antwort1
Sie können map
Anweisungen kaskadieren. Das ist zwar nicht sehr effizient, lässt sich aber leicht erweitern. Außerdem müssen Sie benannte Captures verwenden, da die numerischen Captures überschrieben werden.
Zum Beispiel:
map $request $custom1 {
~^(?<prefix1>.*[\?&]latitude=)([^&]*)(?<suffix1>.*)$ "${prefix1}***$suffix1";
default $request;
}
map $custom1 $customrequest {
~^(?<prefix2>.*[\?&]longitude=)([^&]*)(?<suffix2>.*)$ "${prefix2}***$suffix2";
default $custom1;
}