Я использую следующее правило перезаписи IIS, чтобы заблокировать как можно больше ботов.
<rule name = "BotBlock" stopProcessing = "true">
<match url = ".*" />
<conditions>
<add input = "{HTTP_USER_AGENT}" pattern = "^$|bot|crawl|spider" />
</conditions>
<action type = "CustomResponse" statusCode = "403" statusReason = "Forbidden" statusDescription = "Forbidden" />
</rule>
Это правило блокирует все запросы с пустой строкой User-Agent или строкой User-Agent, содержащей bot
, crawl
и spider
. Это отлично работает, но также блокирует googlebot
, чего я не хочу.
Итак, как мне исключить строку googlebot
из приведенного выше шаблона, чтобы она попала на сайт?
я пробовал
^$|!googlebot|bot|crawl|spider
^$|(?!googlebot)|bot|crawl|spider
^(?!googlebot)$|bot|crawl|spider
^$|(!googlebot)|bot|crawl|spider
Но они либо блокируют все пользовательские агенты, либо все равно не разрешают работу Googlebot. У кого есть решение и кто немного знает о регулярных выражениях?
Итак, благодаря Четвертой птице решение становится следующим:
<add input = "{HTTP_USER_AGENT}" pattern = "^$|\b(?!.*googlebot.*\b)\w*(?:bot|crawl|spider)\w*" />
Попробуйте это регулярное выражение ^$|(?!.*googlebot)(bot|crawl|spider)
Это регулярное выражение не работает, оно по-прежнему срабатывает на части бота в Googlebot.
Если вы хотите сопоставить бота, а не бота Google:
^$|(?<!\bgoogle)bot|crawl|spider
Демонстрация регулярных выражений
Или вы можете сгруппировать альтернативы в группу без захвата и окружить эту группу границами слов, чтобы предотвратить частичные совпадения для всех альтернатив:
^$|\b(?:bot|crawl|spider)\b
Демонстрация регулярных выражений
Спасибо. Первое регулярное выражение отлично работает как регулярное выражение, но не работает в web.config. Это XML-файл, и добавление <
(с <
или нет) привело к ошибке 500.19. Второй работал, но он должен был точно соответствовать боту, сканированию и т. д. Я внес некоторые изменения, и теперь он ближе regex101.com/r/1vO1QH/1. Есть идеи, как запечатлеть __bot
и __bot__
?
@VDWWD Вот так? ^$|(?:__|\b)(?:bot|crawl|spider)(?:\b|__)
regex101.com/r/gFrptq/1
Извините, __
предназначены только для обозначения случайных символов до и после, а не конкретно для подчеркивания... Итак, xybot
, xybotxy
и т. д.
@VDWWD Тогда вы можете использовать границы слов и негативный просмотр вперед ^$|\b(?!googlebot\b)\w*(?:bot|crawl|spider)\w*
regex101.com/r/UEVr19/1
Спасибо! Последний работает идеально! Но я изменил его на ^$|\b(?!.*googlebot.*\b)\w*(?:bot|crawl|spider)\w*
, чтобы он мог содержать робота Google и не идеально подходил.