Блокировка строкой user-agent в 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>
2 ответа
Попробуйте это, и если это не удастся, попробуйте в файле.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.
Для тех, кто может прочитать это позже, вот предложение:
Я удалил разрешающий порядок, запретил директивы из моих файлов.htaccess и смог вызвать ожидаемое поведение для определенных пользовательских агентов, когда я подделал их с помощью User Agent Switcher в Firefox, так что, похоже, возник конфликт. Другие пользовательские агенты в моем списке, однако, не были заблокированы - но это потому, что мне было неясно, какое значение в карате (^) используется в моем httpd.conf. В руководствах по регулярным выражениям, которые я читал, говорилось об этом, но поначалу это не имело смысла: карат заставляет сервер смотреть только на самое начало всей строки пользовательского агента (а не на отдельные строки внутри, как я изначально думал), когда парсинг запроса на соединение Поскольку ключевая строка, идентифицирующая некоторых из пауков и ботов, которую я хочу заблокировать, встречается позже в строке пользовательского агента, мне нужно было сбросить карат, чтобы все заработало.