Отключить или обойти проверку функций для Googlebot (при обслуживании JS-приложения для поисковых роботов)

Я пытаюсь настроить Discourse так, чтобы он полностью отдавал JS-приложение Googlebot — почти у цели.

Благодаря @pfaffman и выполнению кода ниже (в консоли Rails) мне удалось добиться того, что JS-приложение отображается в Chrome при подмене user-agent на googlebot или googlebot smartphone:

SiteSetting.non_crawler_user_agents="trident|webkit|gecko|chrome|safari|msie|opera|goanna|discourse"+'rss|bot|spider|crawler|facebook|archive|wayback|ping|monitor|lighthouse'

Однако при тестировании с помощью инструмента Google для проверки мобильной адаптации (или в разделе «Инспекция URL» в Google Search Console) я получаю пустой скриншот с следующим HTML:

У Bing ситуация похожая, но у них контент отображается. Я полагаю, что Bing показывает контент, потому что его краулер не является «мобильным». Соответствующий пост здесь от @sam.

Согласно @david и этому посту, похоже, что виновником является «определение возможностей» (feature detect).

Я с осторожным оптимизмом полагую, что существует простое решение. Каждые 10–20 попыток при использовании инструмента Googlebot корректно отрисовывает приложение.

Моя теория: поскольку Googlebot, как известно, не загружает все ресурсы при доступе к странице, именно тот JS (который содержит определение возможностей и вызывает откат) не загружается, и поэтому страница выглядит корректно.

Итак, в заключение: как можно отключить определение возможностей для Googlebot (или, если проще, для всех краулеров/ботов)?

Редактирование: На случай, если я ошибся в терминологии: когда в Meta упоминается «определение возможностей» (feature detect), имеется ли в виду определение браузера? (возможно, с файлами вроде browser-detect.js и другими зависимостями)

Или же «определение возможностей» — это общий термин для того, что делает Discourse, пытаясь понять технологии, с помощью которых осуществляется доступ к приложению?

Есть ли причина, по которой вы хотите отдавать JS-версию Googlebot? Google, скорее всего, не сможет найти пагинированные списки, включая пагинированную главную страницу и темы с количеством постов выше определённого порога. В представлении для бота списки тем доступны для сканирования, но Googlebot, вероятно, не будет активировать бесконечную прокрутку.

Рад, что вы спросили. Да, я считаю, что это причина моего «мягкого штрафа» от Google.

Позвольте мне пояснить.

Около сентября-октября 2019 года у нас было очень небрежное обновление сайта, и основной сайт сразу же провалился.

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

Я прочитал бесчисленное количество блогов о SEO, посмотрел видео, изучил посты и даже переписывался с Джоном Мюллером (на Reddit).

Самое большее, что я от него услышал, — это то, что проблема может быть в «вопросах качества». Мы значительно улучшили основной сайт с 1 января этого года, но органический трафик даже не дрогнул.

Discourse: Я установил его ещё в 2013 году и забыл о нём. Почти не проверял его трафик.

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

Когда я попробовал prerender.io для Discourse, позиции основного сайта скакали. Иногда они прыгали на 10–15 мест вверх за ночь, а потом возвращались назад. (Я позже прекратил использовать prerender, так как они не могли рендерить главное меню, вход и т. д.).

Согласно тому, что я читал в интернете, это признак того, что Google не знает, где разместить вас в результатах поиска. Они говорят, что нужно лишь немного «больше», чтобы попасть на хорошую сторону алгоритма.

Ничто из того, что мы делали за последние 3 года, не вызвало этих колебаний в выдаче (SERP).

(Использование инструмента Google Disavow, очистка кода, чистые URL, структура сайта, внутренняя перелинковка, социальные сети, контент и т. д.)

Вы можете возразить: почему Google не наказал вас в 2018 году? (Тогда у вас тоже был Discourse на поддомене).

Ну, я думаю, это было сочетание факторов, уникальных для сайта, его истории и профиля ссылок, что привело к падению в конце 2019 года. Похоже, что Google перераспределил ранжирование сайта и, возможно, придал ссылкам Discourse больший вес, чем раньше.

И вот что важно… Я люблю Discourse. Особенно сейчас, когда я больше участвую в Meta, узнал о всех этих крутых плагинах и функциях, о которых даже не подозревал: Wiki, платные подписки, оглавление и теперь чат!!

Поэтому отказ от Discourse сейчас не вариант — слишком много вложено.

Я обдумывал это и готов рискнуть. Я знаю, что это не будет идеально, но, судя по тому, что я читал и смотрел, Google в последнее время стал очень хорош в понимании JavaScript.

Они даже отказались от схемы сканирования AJAX.

Времена изменились. Сегодня, если вы не блокируете Googlebot от сканирования ваших JavaScript или CSS файлов, мы, как правило, можем рендерить и понимать ваши веб-страницы так же, как современные браузеры.

Замечание: В Discourse есть настройка для сканирования AJAX — думаю, её в конечном итоге придётся убрать.


Итак, план состоит в том, чтобы отдавать приложение Google, сделать всё возможное для устранения любых возникающих проблем с SEO и насладиться всплеском трафика.

Затем я смогу сообщить о результатах на Meta и аргументировать, что Discourse следует рассмотреть возможность оптимизации JavaScript для Google.

Например, возможно, что-то подобное этому (из блога Google) поможет с проблемами пагинации и прокрутки.

И оставить версию для старых браузеров без сканеров.

Если можно добавить… :smirk:

Прежде чем я вообще начал отправлять JS-версию в Google, я экспериментировал с ней.

Я тестировал отправку JS-версии в Google примерно в начале апреля. Помню, что в большинстве случаев она возвращала результат (даже если он выглядел сломанным). Я использовал мобильный инструмент Google.

Мне казалось, что проблема может быть в этом коммите might be this commit — я внес правки в код, перезагрузил сервер, но поведение осталось прежним.

Возможно, кто-то помнит PR или коммит за последние пару месяцев, которые могли изменить определение браузера и/или поискового робота?

Редактирование Извините за все обновления, чем больше информации, тем лучше, верно?

Когда в прошлом месяце я пытался использовать prerender, Google добавил 2000 URL-адресов в охват форума. ( в основном эти URL-адреса )

Все они обслуживались за 0,005 секунды: prerender кэшировал URL-адреса и был готов предоставить их роботу Google. Поэтому робот быстро обработал их все.

Суть в том, что, возможно, поисковый робот «очень привык» к версии без JS и выделил ресурсы для обработки этих 2 тысяч страниц.

Теперь он обращается к сайту именно таким образом, пока не разберётся во всём (и не поймёт, что нужно обращаться с включённым JS). Это лишь теория.

Вы занимались чем-то, что изменило способ индексации Discourse поисковыми системами? Например, пробовали использовать prerender?

Если проверить отчёт о целевых страницах в GA, даст ли он какие-либо подсказки о том, какая часть сайта пострадала?


Что касается основного сайта: если Джон Мюллер предположил наличие проблем с качеством, стоит изучить их документацию по качеству и задать себе вопрос, применимы ли какие-либо из этих пунктов к вашему случаю.

При беглом осмотре обнаруживаются цепочки редиректов с сайта 2019 года, которые могут быть длиннее, чем Google способен просканировать.

Одной из возможных причин внезапного штрафа является то, что URL-адреса с сайта 2019 года содержат 6 редиректов, тогда как Google рекомендует держать их «менее 5», иначе он может не следовать по ним. Это могло создать у Google впечатление, что старые страницы исчезли из сети.

Пример:

curl -sSL -D - http://flynumber.com/virtual-phone-number/united-states_alexandria_1-318 -o /dev/null -H 'User-Agent: header_bot'

Вероятно, проще всего исправить именно редиректы. Вместо такой цепочки:

/a/b/c/d/e/final-destination

лучше сделать так:

/a/final-destination
/b/final-destination
/c/final-destination
/d/final-destination
/e/final-destination

(Кажется, у вас также есть страницы-ловушки и автоматическая генерация синонимов, но сначала стоит попытаться исправить более простую проблему, так как этого может оказаться достаточно.)

Спасибо, Джош, ценю обратную связь.

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

Другими словами, со временем я начал видеть всё больше страниц, на которые я сделал 301-редирект с ключевыми словами, использовавшимися на старых страницах.

Это имеет большой смысл. Посмотрю, как это можно реализовать. В настоящее время в Search Console не видно, что сканер часто получает 301-ответы. Кажется, что по мере улучшения ранжирования они начинают чаще следовать за 301-редиректами. Возможно, это причинно-следственная связь без корреляции.


Это вовсе не критика Discourse — я просто не склонен легко верить утверждениям вроде «тысячи пользователей Discourse имеют отличный органический трафик».

Google тоже не станет нам ничего объяснять.

Всегда нужно помнить: Google — это алгоритм, он не смотрит на вещи человеческими глазами.

Хотя обе версии содержат схожий контент, и Google знает, что это не злонамеренное скрытие текста, ему всё равно приходится корректировать ранжирование.

Одна версия выглядит намного лучше, работает лучше и даёт представление о структуре внутренних ссылок. Другая же — просто glorified RSS-лента.

Google не знает, что у меня есть этот стильный форум, работающий на всех [современных] устройствах, действительно поощряющий обсуждение, и являющийся одним из самых крутых творений интернета.

Я всегда люблю использовать ссылку do-follow с текстом «Powered by Discourse» в версии для сканеров (просто потому, что это легко).

Опять же, я понимаю, что это не злонамеренно, но нужно смотреть на это глазами Google. Вы, FlyNumber (не https://community.cloudflare.com/), предоставляете сканерам эту версию с внешней ссылкой, которую вы не показываете обычным пользователям.

Алгоритм вполне может заметить, что происходит, и проигнорировать внешнюю ссылку на домен Cloudflare (поскольку это такой авторитетный домен).

То, что Google применяет к Cloudflare, не обязательно применится ко мне.

Возможно, вопрос в том, платили ли вы за эту внешнюю ссылку, которую вы показываете ботам (но не хотите показывать обычным пользователям?). Это больше о том, как они могут воспринимать сайт. Я не утверждаю, что так и есть, но это возможность, которую стоит исключить.

Если говорить проще: версия для сканеров не имеет меню или какой-либо реальной структуры.

Именно этот контент алгоритм считает тем, что вы хотите показать конечным пользователям.

С очень общей точки зрения, я не вижу, чтобы алгоритм поощрял такое.

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

Интересное обновление: Google добавил «JSON» в список «типов файлов» в статистике сканирования для моего экземпляра Discourse. «Javascript» — это отдельный «тип файла».

Буду внимательно следить, но всё же хотел бы, чтобы это корректно отображалось в инструменте Google.

Я начинаю думать, что моя логика была ошибочной с самого начала. Это объясняет, почему никто не отреагировал — возможно, ничего не сломано.

Вот свежая статья о том, что для Google нормально показывать белую страницу в скриншоте:

Теперь я вижу «проиндексированный» HTML для главной страницы — это индексированная версия, а не из «Live test». Она показывает полную страницу. Имейте в виду, что Google разобрался с этим, обслуживая полное JS-приложение.

Интересно, что они дошли примерно до 27-го поста на главной странице с точки зрения индексации. Таким образом, функция бесконечной прокрутки понятна Google.

Не уверен, помогло ли это, но я снял галочку с настройки AJAX в административных настройках. Из-за этого Google начал находить URL-адреса, подобные нижеследующему (и обслуживать версию для краулеров). Я снял галочку, и теперь этот URL будет показывать JS-версию:

https://discuss.flynumber.com/t/japan-phone-numbers-disconnect-notice/2351?_escaped_fragment_=

Теперь мне осталось только разобраться, как убрать лишние канонические URL-адреса, которые Discourse создает для страниц пользователей.](Canonical structure for /u/* causing many urls to be indexed)

Итак, после примерно месяца работы SPA-версии (полностью на JavaScript) Discourse я вернулся к версии с краулером.

Вы можете посмотреть историю моих постов: я утверждал, что Google, возможно, лучше понимает JS-версию и ставит её выше, чем версию с краулером. Я ошибался.

Привет, @j127, вы были правы! (Напишу вам в личные сообщения, сэр).

Похоже, Google действительно разобрался с сайтом, но ранжировал его примерно так же (если не чуть ниже).

Версия с краулером также была обновлена в апреле-мае: цвета ссылок, формат и так далее — это тоже неплохо.

По моему мнению, если добавить простое меню и блок «Предлагаемые темы» в версию с краулером, это существенно улучшит SEO для всех.

В остальном я просто хотел поделиться этим, на случай, если кому-то интересно.

Отличная работа, ребята!