Представьте http флуд. Идут запросы вида:
«POST /registration HTTP/1.1» 200 11973 «www.nigma.ru/» «Yandex/1.03.000 (compatible; Win16; M)»
«POST /registration HTTP/1.1» 200 11973 «www.mail.ru/» «Mediapartners-Google»
«GET /registration HTTP/1.1» 200 11973 «www.yahoo.com/» «Yandex/1.01.001 (compatible; Win16; P)»
«POST /registration HTTP/1.1» 200 11973 «www.mail.ru/» «Yandex/2.01.000 (compatible; Win16; Dyatel; Z)»
То есть понятно что агент и рефер неправильный. Но не хочется фильтровать только по одному признаку, так как бот яндекса нужен, да и переходы с этих реферов могут быть. В нгинксе нет «двойного» условия, поэтому я попытался сделать так:
location / {
set $a "ye";
set $b "ah";
set $r "";
if ($http_referer ~* (vkontakte|porn|upyachka|nigma|mail|yahoo)) {
set $r $r$a;
}
if ($http_user_agent ~* (YaDirectBot|Yandex|msnbot|Rambler|Google|Yahoo|Mail)) {
set $r $r$b;
}
if ($r = "yeah") {
return 444;
}
}
Но такое условие срабатывает даже тогда когда обычный пользователь переходит из поиска или вконтакте на сайт, и я не пойму почему срабатывает return 444. Может быть можно как-то проще сделать?