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