map и geo живут в http {} и вычисляются один раз на запрос — без if, без лишнего кода.
geo $remote_addr $is_internal {
default 0;
10.0.0.0/8 1;
192.168.0.0/16 1;
}
map $http_referer $bad_referer {
default 0;
~*spam\.ru 1;
}
server {
if ($bad_referer) { return 444; }
if ($is_internal = 0) { return 403; }
}
geo — хэш по IP, без regex, очень быстро. map — regex по любому заголовку или переменной. Комбинируются свободно.
#nginx #linux #sysadmin
