Nginx corresponde a qualquer palavra na instrução if, exceto uma

Nginx corresponde a qualquer palavra na instrução if, exceto uma

Estou usando a seguinte instrução if regex na nginxconfiguração para corresponder e bloquear algumas solicitações incorretas dentro do uri da solicitação. Essas consultas incorretas sempre solicitam apenas um argumento, mas sempre com nome aleatório (e contagem de alfanum). Eles também sempre acessam a página inicial.

Exemplo de consulta incorreta: /?some1bad0query2=nminkvywbjfdysnvhp

if ($request_uri ~ "[\w]{5,25}\=[\w]{5,25}$") {
  return 403;
}

Como posso modificar esse regex para excluir a correspondência de alguns nomes de argumentos como keyou query(ou seja, /?query=somestring) ?

Tentei usar colchetes e ?(!query)não tive sorte.

Por favor, ajude-me a corrigir esta instrução regex. Desde já, obrigado.

Responder1

Existem duas maneiras de fazer isso. Use umafirmação antecipada negativaou use ummap.

Por exemplo:

if ($request_uri ~ "(?!query)\w{5,25}=\w{5,25}$") { return 403; }

A vantagem é mapque as expressões regulares são avaliadas em ordem até que uma correspondência seja encontrada, de modo que expressões lookahead complexas podem ser evitadas.

Por exemplo:

map $request_uri $reject {
    ~*^/\?query=                0;
    "~*^/\?\w{5,25}=\w{5,25}$"  1;
}
server {
    ...
    if ($reject) { return 403; }
    ...
}

O mapbloco vive fora do serverbloco. Se a regra se aplicar apenas a URIs que começam com /?, você deverá adicionar isso à expressão regular (como mostrado no meu segundo exemplo).

informação relacionada