Блокировка ботов с помощью файла .htaccess в Apache

Вопрос или проблема

Я пытаюсь заблокировать ботов (в основном “AI” ботов).

У меня это в файле .htaccess.

<IfModule mod_rewrite.c>                                                                              
RewriteEngine on                                                                                      
RewriteBase /                                                                                         

# блокировать “AI” ботов                                                                                                                                                                                                  
RewriteCond %{HTTP_USER_AGENT} (AdsBot-Google|Amazonbot|anthropic-ai|Applebot|Applebot-Extended|AwarioRssBot|AwarioSmartBot|Bytespider|CCBot|ChatGPT|ChatGPT-User|Claude-Web|ClaudeBot|cohere-ai|DataForSeoBot|Diffbot|FacebookBot|facebookexternalhit|Google-Extended|GPTBot|ImagesiftBot|magpie-rawler|omgili|Omgilibot|peer39_crawler|PerplexityBot|YouBot|AhrefsBot|Barkrowler|SemrushBot|DotBot) [NC] 

RewriteRule ^ – [F]                                                                                   
</IfModule>                                                                                           

Кажется, это работает для большинства ботов, но у меня все еще есть соединения для некоторых из них.

Например:

185.191.171.7 - - [17/Jul/2024:11:27:12 +0200] "GET my/website/url HTTP/1.1" 200 14234 "-" "Mozilla/5.0 (compatible; SemrushBot/7~bl; +http://www.semrush.com/bot.html)"

Я не понимаю, почему это соединение проходит через Apache, в то время как “SemrushBot” находится в списке блокировки. Почему так и как можно улучшить блокировку?

С вашим текущим правилом вы блокируете только точную строку SemrushBot, но в данном случае user-agent — Mozilla/5.0 (compatible; SemrushBot/7~bl; +http://www.semrush.com/bot.html)

Измените ваш .htaccess на:

<IfModule mod_rewrite.c>                                                                              
RewriteEngine on                                                                                      
RewriteBase /                                                                                                                                                                                            
# блокировать “AI” ботов                                                                                                                                                                                                  
RewriteCond %{HTTP_USER_AGENT} ^.*(AdsBot-Google|Amazonbot|anthropic-ai|Applebot|Applebot-Extended|AwarioRssBot|AwarioSmartBot|Bytespider|CCBot|ChatGPT|ChatGPT-User|Claude-Web|ClaudeBot|cohere-ai|DataForSeoBot|Diffbot|FacebookBot|facebookexternalhit|Google-Extended|GPTBot|ImagesiftBot|magpie-rawler|omgili|Omgilibot|peer39_crawler|PerplexityBot|YouBot|AhrefsBot|Barkrowler|SemrushBot|DotBot).*$ [NC]                                                                                                        
RewriteRule ^ – [F]                                                                                   
</IfModule>  

и это должно работать хорошо.

Ответ или решение

Если вы хотите эффективно блокировать боты с помощью файла .htaccess в Apache, вам необходимо правильно настроить перезаписывающие правила (Rewrite Rules). Учитывая предоставленный фрагмент кода и проблему, давайте разберемся, почему текущая конфигурация не полностью блокирует всех нежелательных ботов и как её можно улучшить.

Теория

Apache .htaccess позволяет настраивать правила, которые управляют доступом к вашему веб-серверу на основе определённых условий. Одним из таких условий является идентификация по строке User-Agent. Однако, проблема часто заключается в том, что строка User-Agent, предоставляемая ботами, может быть очень вариативной и не всегда имеет точное совпадение с тем, что вы указали в вашем текущем списке.

Ваше текущее правило использует RewriteCond, чтобы проверять строки User-Agent на соответствие строго перечисленным подстрокам. Однако пользовательские агенты могут содержать дополнительные параметры или версии, как в случае с SemrushBot, что нужно учитывать.

Пример

В вашем запросе указывается следующий User-Agent:

Mozilla/5.0 (compatible; SemrushBot/7~bl; +http://www.semrush.com/bot.html)

Хотя SemrushBot присутствует в вашем списке, сам по себе User-Agent содержит дополнительные данные, которые ваше изначальное правило может не учитывать из-за отсутствия поддержки полного анализа содержимого строки.

Применение

Чтобы более гибко обрабатывать подобные случаи, необходимо расширить условие RewriteCond за счёт использования регулярных выражений, чтобы они искали вхождение на протяжении всей строки, а не только точное совпадение. Ваш модифицированный фрагмент конфигурации может выглядеть следующим образом:

<IfModule mod_rewrite.c>
    RewriteEngine on
    RewriteBase /

    # Блокировка "AI" ботов
    RewriteCond %{HTTP_USER_AGENT} ^.*(AdsBot-Google|Amazonbot|anthropic-ai|Applebot|Applebot-Extended|AwarioRssBot|AwarioSmartBot|Bytespider|CCBot|ChatGPT|ChatGPT-User|Claude-Web|ClaudeBot|cohere-ai|DataForSeoBot|Diffbot|FacebookBot|facebookexternalhit|Google-Extended|GPTBot|ImagesiftBot|magpie-rawler|omgili|Omgilibot|peer39_crawler|PerplexityBot|YouBot|AhrefsBot|Barkrowler|SemrushBot|DotBot).*$ [NC]
    RewriteRule ^ – [F]
</IfModule>

Эта конфигурация позволяет проверить нахождение перечисленных подстрок User-Agent в любом месте, а флаг [NC] обеспечивает нечувствительность к регистру.

Важно регулярно обновлять список известных ботов и постоянно проверять логи вашего сервера. Это позволит вам оптимально корректировать ваш список блокировки на основе актуальных данных.

Оцените материал
Добавить комментарий

Капча загружается...