В приложении Discourse обнаружена ошибка, связанная с обновлением элемента метаданных <link rel="canonical"> в секции <head> DOM-дерева Discourse.
По сути, когда клиентский браузер заходит в приложение и оно загружается впервые, элемент <link rel="canonical" href=""> устанавливается в соответствии с этой начальной загрузкой страницы. Однако, когда пользователь кликает внутри приложения (что является обычным поведением), без ручной перезагрузки страницы, ссылка <link rel="canonical"> не обновляется.
Я протестировал эту ошибку и воспроизвел её на сайте meta:
Рис 1. Вход на meta с главной страницы: ссылка canonical установлена верно, как и элемент заголовка.
Эта ошибка может негативно повлиять на SEO, поскольку при индексации страницы Google, если Googlebot не выполняет «жёсткую перезагрузку» каждой страницы, каноническая информация будет некорректной для каждой страницы (как показано в последовательности изображений выше).
Воспроизводимость
Я последовательно воспроизвёл эту ошибку как на сайте meta, так и на нашем сайте.
Примечания
Я сталкивался с подобными проблемами жизненного цикла node.js (SPA) в других веб-фреймворках (не только в Ember), когда элементы DOM не обновляются из-за хуков жизненного цикла (в Ember и других SPA-фреймворках) внутри веб-приложения.
Это никогда не произойдёт, так как мы не предоставляем SPA для Googlebot. Вы также можете установить свой User Agent как User Agent GoogleBot, чтобы посмотреть, как это работает.
Мы предоставляем краулерам совершенно другой документ, так как не все краулеры могут выполнять JavaScript, и мы хотим, чтобы Discourse был доступен и для таких клиентов. Даже если они получают уменьшенный функционал, они могут потреблять весь контент.
Теперь я понимаю, что некоторые предыдущие обсуждения SPA, «бесконечной прокрутки» и других вопросов, связанных с SEO, были совершенно неверными, поскольку SPA не предоставляется GoogleBot.
Это меняет мой подход к некоторому пользовательскому коду, который я недавно написал; теперь я знаю, что нужно проверять это, используя User-Agent GoogleBot в консоли.
Какой лучший способ добавить один пользовательский JavaScript-файл в HTML, который рендерится для GoogleBot?
Существует ли «стандартный способ» изменения HTML, предоставляемого ботам?
Причина, по которой я спрашиваю, в том, что у нас есть пользовательский код, созданный в плагине, который я написал (предназначенном для ботов); но я проверил, используя User-Agent GoogleBot в консоли (еще раз спасибо, что подсказали мне это), и GoogleBot не использует ни одной части этого пользовательского кода плагина.
Временно, поскольку я не могу выполнить желаемое в плагине на основе Handlebars для HTML, обслуживаемого для краулеров, мы решили просто удалить канонические теги из Discourse. Это частичное решение на данный момент, пока я не разберусь, как модифицировать канонический тег с помощью JavaScript для веб-краулеров.
Discourse предоставляет удобный механизм для таких изменений в файлах контейнеров yml, поэтому именно это я и сделал сегодня.
Я очень благодарен сообществу Discourse meta за то, что они указали, что приложение Discourse, обслуживаемое для (идентифицированных) краулеров, не совпадает со страницами, обслуживаемыми для пользователей.
Обратите внимание, что я не рекомендую это «временное решение» другим системным администраторам Discourse. Я просто делюсь тем, что решил сделать на данный момент, и тем, как я это сделал (пока мы не придумаем более интересное решение).