
Esta pregunta es similar a¿Excluir un parámetro de consulta específico para que no se inicie sesión en Nginx?pero para múltiples parámetros. Lo que quiero hacer es ofuscartodoparámetros de consulta, que especifico, que están presentes en el URI de solicitud. Por ejemplo, digamos que tengo la siguiente solicitud:
GET /index.html?latitude=55.70&longitude=32.2341&otherkey=value HTTP/1.1
entonces me gustaria amboslatitude
y longitude
para ser ofuscado en los registros:
GET /index.html?latitude=***&longitude=***&otherkey=value HTTP/1.1
Si intento definir el formato de registro de esta manera:
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;
}
entonces solo se tiene en cuenta el último parámetro de la expresión regular y el resultado será:
GET /index.html?latitude=55.70&longitude=***&otherkey=value HTTP/1.1
cual esnolo que quiero.
Entonces la pregunta es, ¿cómo puedo configurar Nginx para ofuscar?todode los parámetros dados (consulta/uri) que he definido?
Estoy usando Nginx 1.19.5.
Respuesta1
Puede realizar map
declaraciones en cascada. Puede que no sea muy eficiente, pero se puede ampliar fácilmente. Además, deberá utilizar capturas con nombre, ya que las capturas numéricas se sobrescribirán.
Por ejemplo:
map $request $custom1 {
~^(?<prefix1>.*[\?&]latitude=)([^&]*)(?<suffix1>.*)$ "${prefix1}***$suffix1";
default $request;
}
map $custom1 $customrequest {
~^(?<prefix2>.*[\?&]longitude=)([^&]*)(?<suffix2>.*)$ "${prefix2}***$suffix2";
default $custom1;
}