Назад | Перейти на главную страницу

Блокировка строкой пользовательского агента в httpd.conf не действует

Я хотел бы заблокировать некоторых пауков и плохих ботов текстовой строкой пользовательского агента для всех моих виртуальных хостов через httpd.conf, но пока не добился успеха. Ниже представлено содержимое моего файла http.conf. Есть идеи, почему это не работает? env_module загружен.

SetEnvIfNoCase User-Agent "^BaiDuSpider" UnwantedRobot
SetEnvIfNoCase User-Agent "^Yandex" UnwantedRobot
SetEnvIfNoCase User-Agent "^Exabot" UnwantedRobot
SetEnvIfNoCase User-Agent "^Cityreview" UnwantedRobot
SetEnvIfNoCase User-Agent "^Dotbot" UnwantedRobot
SetEnvIfNoCase User-Agent "^Sogou" UnwantedRobot
SetEnvIfNoCase User-Agent "^Sosospider" UnwantedRobot
SetEnvIfNoCase User-Agent "^Twiceler" UnwantedRobot
SetEnvIfNoCase User-Agent "^Java" UnwantedRobot
SetEnvIfNoCase User-Agent "^YandexBot" UnwantedRobot
SetEnvIfNoCase User-Agent "^bot*" UnwantedRobot
SetEnvIfNoCase User-Agent "^spider" UnwantedRobot
SetEnvIfNoCase User-Agent "^crawl" UnwantedRobot
SetEnvIfNoCase User-Agent "^NG\ 1.x (Exalead)" UnwantedRobot
SetEnvIfNoCase User-Agent "^MJ12bot" UnwantedRobot

<Directory "/var/www/">
    Order Allow,Deny
    Allow from all
    Deny from env=UnwantedRobot
</Directory>
<Directory "/srv/www/">
    Order Allow,Deny
    Allow from all
    Deny from env=UnwantedRobot
</Directory>

РЕДАКТИРОВАТЬ - @Shane Madden: У меня есть файлы .htaccess в корневом каталоге каждого виртуального хоста со следующим.

order allow,deny
deny from xxx.xxx.xxx.xxx
deny from xx.xxx.xx.xx
deny from xx.xxx.xx.xxx
...
allow from all

Может ли это вызвать конфликт? Пример конфигурации VirtualHost:

<VirtualHost xx.xxx.xx.xxx:80>
 ServerAdmin admin@domain.com
 ServerName domain.com
 ServerAlias www.domain.com
 DocumentRoot /srv/www/domain.com/public_html/
 ErrorLog "|/usr/bin/cronolog /srv/www/domain.com/logs/error_log_%Y-%m"
 CustomLog "|/usr/bin/cronolog /srv/www/domain.com/logs/access_log_%Y-%m"     combined
</VirtualHost>

Попробуйте это, а если не удастся, попробуйте в файле .htaccess ...

   #Bad bot removal
   RewriteEngine on
   RewriteCond %{HTTP_USER_AGENT} ^useragent1 [OR]
   RewriteCond %{HTTP_USER_AGENT} ^useragent2 [OR]
   RewriteCond %{HTTP_USER_AGENT} ^useragent3
   RewriteRule ^(.*)$ http://website-you-want-to-send-bad-bots-to.com

Следуйте этому шаблону и не ставьте [ИЛИ] на самый последний.

РЕДАКТИРОВАТЬ: Новое решение:

Если вы хотите заблокировать всех (дружественных) ботов, создайте файл с именем «robots.txt» и поместите его туда, где находится ваш index.html. Внутри поместите это:

User-agent: *
Disallow: /

Вам все равно нужно будет вести список, подобный моему исходному ответу (выше), чтобы запретить ботов, игнорирующих robots.txt.

Для тех, кто прочтет это позже, сделка вот в чем:

Я удалил директивы order allow, deny из моих файлов .htaccess и смог вызвать ожидаемое поведение для определенных пользовательских агентов, когда я подделал их с помощью User Agent Switcher в Firefox, поэтому похоже, что возник конфликт. Однако другие пользовательские агенты в моем списке не были заблокированы - но это потому, что я не понимал значения символа "^", используемого в моем httpd.conf. В учебниках по регулярным выражениям, которые я читал, говорится об этом, но поначалу это не очень хорошо понималось: карат заставляет сервер смотреть только на самое начало из весь строка пользовательского агента (а не отдельные строки внутри, как я изначально думал) при разборе запроса на подключение. Поскольку строка идентификации ключа для некоторых пауков и ботов, которые я хочу заблокировать, появляется позже в строке пользовательского агента, мне нужно было отбросить карат, чтобы все заработало.