Вопрос или проблема
У меня есть файл 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.
Неоднозначность в стандарте
Предложенный стандарт 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, гарантируя, что ваши ограничения будут соблюдены.