Можно ли сопоставить два разных правила запрета в robots.txt, одно с использованием подстановочного знака, а другое по имени?

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

У меня есть файл robots.txt, который выглядит следующим образом:

    User-agent: *
    Disallow: /account/
    Disallow: /captcha/
    Disallow: /checkout/

    User-agent: DataForSeoBot
    Disallow: /p-

    User-agent: UptimeRobot
    Disallow: /p-

У меня есть множество файлов и папок в моем правиле запрета с использованием символа подстановки. Затем я хочу дополнительно заблокировать доступ к URL-адресам, которые начинаются с /p-, для определенных индексаторов, таких как DataForSeoBot. До того, как я добавил конкретное правило для DataForSeo, он видел длинный список URL-адресов в моем правиле с подстановочным знаком. После добавления этого дополнительного конкретного правила по их названию бота, теперь единственное правило Disallow, которое видит DataForSeoBot, это /p-. Они неправильно читают файл robots.txt, или я неправильно его написал? Надеюсь, мне не придётся повторять всё первое правило для каждого индексатора, для которого я также хочу запретить /p-, так как таких примерно десяток. Я также попытался переместить конкретное правило по имени наверх перед правилом с подстановкой, но это не повлияло.

Я тестирую, используя функцию на их веб-сайте, чтобы увидеть, как они читают файл robots.txt.

DataForSeo robots.txt

Неоднозначность в стандарте

Предложенный стандарт RFC 9309: Протокол исключения роботов гласит в разделе 2.2.1, что:

Если существует более одной группы, соответствующей user-agent, правила этих групп ДОЛЖНЫ быть объединены в одну группу и проанализированы в соответствии с разделом 2.2.2.

Это определяет, что правила для user-agents, соответствующих * (всем user-agents), будут объединены для всех user-agents, несмотря на наличие строки user-agent с более конкретным соответствием.

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

Если совпадающая группа не существует, индексаторы ДОЛЖНЫ подчиняться группе со строкой user-agent со значением “*”, если оно присутствует.

Это подразумевает, что user-agent: * может иметь какое-то особое значение, которое в итоге не подпадает под “ДОЛЖНЫ быть объединены”. Зачем вообще была бы нужна эта фраза, если * уже соответствует всем user-agents и все соответствующие user-agents должны быть объединены? Также примеры в разделе 5.1 написаны таким образом, что поддерживают эту интерпретацию.

Также всегда могут быть неправильные интерпретации в реализации. Например, нужно быть очень осторожным с самым длинным совпадением в разделе 5.2; это является требованием для совпадения URL-адресов и только URL-адресов. Требование по объединению совпадающих user-agents совсем противоположное.

Практическое решение

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

User-agent: *
Disallow: /account/
Disallow: /captcha/
Disallow: /checkout/

User-agent: DataForSeoBot
Disallow: /p-
Disallow: /account/
Disallow: /captcha/
Disallow: /checkout/

User-agent: UptimeRobot
Disallow: /p-
Disallow: /account/
Disallow: /captcha/
Disallow: /checkout/

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

Теория

Вопрос касается спецификации Robots Exclusion Protocol, применяемой для управления доступом веб-сканеров к определенным секциям веб-сайта. Согласно спецификации RFC 9309, если несколько групп правил соответствуют одному user-agent, правила из всех этих групп должны быть объединены. Однако возникает неоднозначность при наличии wildcard-записи User-agent: *, так как, согласно дальнейшему объяснению в спецификации, если отсутствует точное совпадение по user-agent, сканеры должны следовать правилам группы с User-agent: *.

Пример

В вашем случае robots.txt файл имеет следующие записи:

User-agent: *
Disallow: /account/
Disallow: /captcha/
Disallow: /checkout/

User-agent: DataForSeoBot
Disallow: /p-

User-agent: UptimeRobot
Disallow: /p-

Кажется, что DataForSeoBot игнорирует правила из общего раздела и видит только правила, специфичные для него, что противоречит вышеупомянутой спецификации.

Применение

Чтобы избежать конфликтов и интерпретации, не соответствующей вашим ожиданиям, я рекомендую явным образом повторять общие правила для каждого специфичного user-agent, несмотря на то, что это увеличит объем файла. Это может обеспечить правильное восприятие вашего файла robots.txt большинством веб-сканеров и избежать непонимания. Вот как можно переписать ваш файл:

User-agent: *
Disallow: /account/
Disallow: /captcha/
Disallow: /checkout/

User-agent: DataForSeoBot
Disallow: /p-
Disallow: /account/
Disallow: /captcha/
Disallow: /checkout/

User-agent: UptimeRobot
Disallow: /p-
Disallow: /account/
Disallow: /captcha/
Disallow: /checkout/

Таким образом, каждый веб-сканер будет явно видеть все правила, которых он должен следовать. Такой подход снизит риск неправильной интерпретации файла robots.txt, гарантируя, что ваши ограничения будут соблюдены.

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

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