2014-01-27 5 views
0

Я пытаюсь глобально блокировать пустые пользовательские агенты от доступа к сайтам на сервере. Я добавил отрицательный http_user_agent, но он вообще не работает. Правильно ли я делаю это? Вот мой nginx.conf:Как заблокировать пустые пользовательские агенты в nginx?

#user nginx; 
worker_processes 1; 

#error_log /var/log/nginx/error.log; 
#error_log /var/log/nginx/error.log notice; 
#error_log /var/log/nginx/error.log info; 

#pid  /var/run/nginx.pid; 


events { 
    worker_connections 1024; 
} 


http { 
    include  mime.types; 
    default_type application/octet-stream; 

    #log_format main '$remote_addr - $remote_user [$time_local] "$request" ' 
    #     '$status $body_bytes_sent "$http_referer" ' 
    #     '"$http_user_agent" "$http_x_forwarded_for"'; 

    #access_log /var/log/nginx/access.log main; 

    sendfile  on; 
    #tcp_nopush  on; 

    #keepalive_timeout 0; 
    keepalive_timeout 65; 
    #tcp_nodelay  on; 

    # enable gzip compression 
    gzip on; 
    gzip_min_length 1100; 
    gzip_buffers 4 32k; 
    gzip_types text/plain application/x-javascript text/xml text/css; 
    gzip_vary on; 
    # end gzip configuration 

    server_tokens off; 

    server { 
     if ($http_user_agent ~* (^$)) { return 403; } 
    } 

    include /etc/nginx/conf.d/*.conf; 
} 
+0

Дело в том, что этот серверный блок не имеет имени и, вероятно, не будет соответствовать, если все остальные серверы не совпадают, я не знаю, работает ли 'if' в контексте' http', вы должны попробовать удалить 'server' и сохраните' if' на уровне 'http' и попробуйте, иначе вам нужно добавить его на каждый' сервер', который вы создаете. –

+0

Спасибо за помощь. Я попытался удалить сервер {}, но если утверждения не являются разрешено в этом контексте – Neverlax

+0

, то вам нужно использовать его внутри виртуальных хостов –

ответ

1

Вы можете добиться такого результата с помощью модуля ngx_lua. Это не официальный модуль, но если вы используете Ubuntu, вы можете получить его, установив пакет nginx-extras. После того, как вы все готовы, добавьте следующий фрагмент код в свой блок HTTP

access_by_lua " 
    local ua = ngx.req.get_headers()['User-Agent'] 
    if ua == '' or ua == nil then 
    return ngx.exit(ngx.HTTP_FORBIDDEN) 
    end"; 

Мы проверяем на пустую строку для пустого UA (очевидно) и для нуля в случае заголовок не был направлен в первую очередь.

Смежные вопросы