Представьте 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 / {<br/>
set $a "ye";<br/>
set $b "ah";<br/>
set $r "";<br/>
<br/>
if ($http_referer ~* (vkontakte|porn|upyachka|nigma|mail|yahoo)) {<br/>
set $r $r$a;<br/>
}<br/>
<br/>
if ($http_user_agent ~* (YaDirectBot|Yandex|msnbot|Rambler|Google|Yahoo|Mail)) {<br/>
set $r $r$b;<br/>
}<br/>
<br/>
if ($r = "yeah") {<br/>
return 444;<br/>
}<br/>
}<br/>
Но такое условие срабатывает даже тогда когда обычный пользователь переходит из поиска или вконтакте на сайт, и я не пойму почему срабатывает return 444. Может быть можно как-то проще сделать?