Reescrever no Nginx só funciona em caminhos, então você precisa usar uma comparação nas variáveis separadamente para identificá-los. O que você pediu seria parecido com:
if ($args ~ "([a-f0-9]{12,})=([a-f0-9]{12,})" ){
rewrite ^/$ /404_rewrite?;
}
location /404_rewrite {
return 404;
}
-
A correspondência para os argumentos deve estar entre aspas, caso contrário, o
{
e}
confundiriam o Nginx. -
O
?
no final da reescrita faz o Nginx eliminar todos os parâmetros, em vez de anexá-los ao URL reescrito.
No entanto, você pode desejar que o Nginx tente atrasar cada solicitação no DOS, em vez de lidar com elas o mais rápido possível.
limit_req_zone $binary_remote_addr zone=dos_attack:20m rate=30r/m;
if ($args ~ "([a-f0-9]{12,})=([a-f0-9]{12,})" ){
rewrite ^/$ /404_rewrite?;
}
location /404_rewrite {
limit_req zone=dos_attack burst=1;
internal;
return 404;
}
O que isto faz é:
-
Defina o número de solicitações em 30r / m, que são 30 solicitações por minuto ou uma solicitação a cada dois segundos.
-
Define a rajada em 1. Para a taxa normal de limitação, a rajada é definida em > 1 para permitir que os clientes não sejam limitados se ultrapassarem acidentalmente o limite de taxa por um curto período de tempo.
-
Aloca 20 megabytes para armazenar as informações sobre a zona de limitação de taxa. De acordo com a documentação de limite de taxa , cada
$binary_remote_addr
leva 64 bytes para armazenar, portanto, essa limitação de taxa funcionaria até um par de cem mil máquinas individuais fazendo o DOS. Se fossem mais máquinas do que isso, a limitação de taxa seria quebrada.