Перезапись в Nginx работает только по путям, поэтому вам нужно использовать сравнение переменных отдельно для их идентификации. То, что вы просили, будет выглядеть так:
if ($args ~ "([a-f0-9]{12,})=([a-f0-9]{12,})" ){
rewrite ^/$ /404_rewrite?;
}
location /404_rewrite {
return 404;
}
Сопоставление аргументов должно быть внутри кавычек, иначе {
и }
запутают Nginx.
?
в конце перезаписи заставляет Nginx отбрасывать все параметры, а не добавлять их в перезаписанный URL.
Однако вы можете захотеть, чтобы Nginx пытался задерживать каждый запрос в DOS, а не обрабатывать их как можно быстрее.
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;
}
Это делает следующее:
Устанавливает количество запросов на 30r / m, что составляет 30 запросов в минуту или один запрос каждые две секунды.
Устанавливает пакет at 1. Для нормального ограничения скорости пакет устанавливается на> 1, чтобы позволить клиентам не быть ограниченными, если они случайно превышают лимит скорости в течение короткого периода времени.
Выделяет 20 мегабайт для хранения информации об ограничении скорости зона. Согласно документации по ограничению скорости каждый $ binary_remote_addr
занимает 64 байта для хранения, так что это ограничение скорости будет работать до пары сотен тысяч отдельных машин, выполняющих DOS. Если бы машин было больше, ограничение скорости вышло бы из строя.