Blocking by user agent if ip doesn't match

Igor Sysoev igor at sysoev.ru
Tue May 31 23:34:47 MSD 2011


On Tue, May 31, 2011 at 10:19:13PM +0300, Alexandr Gomoliako wrote:
> On 5/31/11, karabaja <nginx-forum at nginx.us> wrote:
> > syntax would be in nginx config or if it is even possible to match both
> > statements.
> 
> It is possible and there are different ways to match two conditions. I
> like this one:
> 
> geo $google {
>     default 0;
>     66.0.0.0/8 1;
> }
> map $http_user_agent $googlebot {
>     default 0;
>     ~google  $google;
> }
> 
> server {
>     location / {
>         if ($googlebot) {
>             ...
>         }
>     }
> }

It works since 0.9.6. I'm going to change case sensitivity like this

~Google      # case sensitive
~*google     # case insensitive

Expression compatible with old and new syntax (for gracefull upgrade):

~(?i)google  # case insensitive

As to configuraiton it's better to use this logic:

geo $not_google {
    default     1;
    66.0.0.0/8  0;
}

map $http_user_agent  $bots {
    default           0;
    ~(?i)google       $not_google;
    "~(?i)(Purebot|Lipperhey|MaMaCaSpEr|libwww-perl|Mail.Ru|gold crawler)"  1;
}

server {
    location / {
        if ($bots) {
            return 403;
        }
    }
}


-- 
Igor Sysoev



More information about the nginx mailing list