Модуль перезаписи IIS исключает ботов, но разрешает GoogleBot

Я использую следующее правило перезаписи 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*" />
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
146
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Попробуйте это регулярное выражение ^$|(?!.*googlebot)(bot|crawl|spider)

Ответ только по коду - это некачественно😯. Хотя это регулярное выражение может быть полезным, вы можете улучшить его, рассказав, почему оно работает, как оно работает, когда его следует использовать и каковы его ограничения 👍. Пожалуйста, [отредактируйте✏️] свой ответ, включив в него объяснение и ссылку на соответствующую документацию.
dan1st 31.03.2024 18:03

Это регулярное выражение не работает, оно по-прежнему срабатывает на части бота в Googlebot.

VDWWD 31.03.2024 19:47
Ответ принят как подходящий

Если вы хотите сопоставить бота, а не бота Google:

^$|(?<!\bgoogle)bot|crawl|spider

Демонстрация регулярных выражений

Или вы можете сгруппировать альтернативы в группу без захвата и окружить эту группу границами слов, чтобы предотвратить частичные совпадения для всех альтернатив:

^$|\b(?:bot|crawl|spider)\b

Демонстрация регулярных выражений

Спасибо. Первое регулярное выражение отлично работает как регулярное выражение, но не работает в web.config. Это XML-файл, и добавление <&lt; или нет) привело к ошибке 500.19. Второй работал, но он должен был точно соответствовать боту, сканированию и т. д. Я внес некоторые изменения, и теперь он ближе regex101.com/r/1vO1QH/1. Есть идеи, как запечатлеть __bot и __bot__?

VDWWD 31.03.2024 19:45

@VDWWD Вот так? ^$|(?:__|\b)(?:bot|crawl|spider)(?:\b|__)regex101.com/r/gFrptq/1

The fourth bird 31.03.2024 19:51

Извините, __ предназначены только для обозначения случайных символов до и после, а не конкретно для подчеркивания... Итак, xybot, xybotxy и т. д.

VDWWD 31.03.2024 19:57

@VDWWD Тогда вы можете использовать границы слов и негативный просмотр вперед ^$|\b(?!googlebot\b)\w*(?:bot|crawl|spider)\w*regex101.com/r/UEVr19/1

The fourth bird 31.03.2024 20:33

Спасибо! Последний работает идеально! Но я изменил его на ^$|\b(?!.*googlebot.*\b)\w*(?:bot|crawl|spider)\w*, чтобы он мог содержать робота Google и не идеально подходил.

VDWWD 31.03.2024 21:31

Другие вопросы по теме

Выбрать все строки после последнего появления определенного символа
Как заставить код регулярного выражения применяться только к пустым целевым ячейкам
Измените двоичные данные, такие как «111 на 001», в Python, используя if else или регулярное выражение
Регулярное выражение конвертируется в формат MYSQL
Как сохранить среднюю часть текстовой строки с помощью gsub/sub?
Git+Bash / GitBash: добавление файлов, соответствующих именам файлов, состоящим как из первых букв, так и из строчных букв определенного шаблона, а также с соответствующими множественными числами
Соответствие «нет» (0 или более «0») с помощью JavaScript Regex
Как обрабатывать регулярное выражение в селекторе BeautifulSoup/CSS?
Ищу шаблон Regex для возврата результатов, аналогичных моей текущей функции
Регулярное выражение PHP Perl – URL-адресу не предшествует знак равенства и возможны одинарные или двойные кавычки