
Esta questão é semelhante aExcluir um parâmetro de consulta específico do login no Nginx?mas para vários parâmetros. O que eu quero fazer é ofuscartodosparâmetros de consulta, que eu especifico, que estão presentes no URI da solicitação. Por exemplo, digamos que eu tenha a seguinte solicitação:
GET /index.html?latitude=55.70&longitude=32.2341&otherkey=value HTTP/1.1
então eu gostaria dos doislatitude
e longitude
a ser ofuscado nos logs:
GET /index.html?latitude=***&longitude=***&otherkey=value HTTP/1.1
Se eu tentar definir o formato do log assim:
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;
}
então apenas o último parâmetro da regex é levado em consideração e o resultado será:
GET /index.html?latitude=55.70&longitude=***&otherkey=value HTTP/1.1
qual énãoo que eu quero.
Então a questão é: como posso configurar o Nginx para ofuscartodosdos parâmetros fornecidos (consulta/uri) que defini?
Estou usando o Nginx 1.19.5.
Responder1
Você pode colocar map
instruções em cascata. Pode não ser muito eficiente, mas é facilmente estendido. Além disso, você precisará usar capturas nomeadas, pois as capturas numéricas serão substituídas.
Por exemplo:
map $request $custom1 {
~^(?<prefix1>.*[\?&]latitude=)([^&]*)(?<suffix1>.*)$ "${prefix1}***$suffix1";
default $request;
}
map $custom1 $customrequest {
~^(?<prefix2>.*[\?&]longitude=)([^&]*)(?<suffix2>.*)$ "${prefix2}***$suffix2";
default $custom1;
}