Метаданные Canonical в приложении Discourse не меняются корректно, если не загружены веб-сканером

В приложении Discourse обнаружена ошибка, связанная с обновлением элемента метаданных <link rel="canonical"> в секции <head> DOM-дерева Discourse.

По сути, когда клиентский браузер заходит в приложение и оно загружается впервые, элемент <link rel="canonical" href=""> устанавливается в соответствии с этой начальной загрузкой страницы. Однако, когда пользователь кликает внутри приложения (что является обычным поведением), без ручной перезагрузки страницы, ссылка <link rel="canonical"> не обновляется.

Я протестировал эту ошибку и воспроизвел её на сайте meta:

Рис 1. Вход на meta с главной страницы: ссылка canonical установлена верно, как и элемент заголовка.

Рис 2. Переход к теме. Элемент заголовка изменяется корректно, но ссылка canonical установлена неверно (не обновляется, как должно быть).

Рис 3. Переход к другой теме. Элемент заголовка изменяется корректно, но ссылка canonical установлена неверно (не обновляется, как должно быть).

Последствия для SEO

Эта ошибка может негативно повлиять на SEO, поскольку при индексации страницы Google, если Googlebot не выполняет «жёсткую перезагрузку» каждой страницы, каноническая информация будет некорректной для каждой страницы (как показано в последовательности изображений выше).

Воспроизводимость

Я последовательно воспроизвёл эту ошибку как на сайте meta, так и на нашем сайте.

Примечания

Я сталкивался с подобными проблемами жизненного цикла node.js (SPA) в других веб-фреймворках (не только в Ember), когда элементы DOM не обновляются из-за хуков жизненного цикла (в Ember и других SPA-фреймворках) внутри веб-приложения.

1 лайк

Это никогда не произойдёт, так как мы не предоставляем SPA для Googlebot. Вы также можете установить свой User Agent как User Agent GoogleBot, чтобы посмотреть, как это работает.

4 лайка

Привет, @Falco!

Спасибо за ответ.

Да, проблема отсутствует, когда UA установлен как GoogleBot (только что проверил).

Согласен, что для SEO это может не быть проблемой, поскольку вы не отдаёте SPA GoogleBot, но тем не менее это баг в SPA.

Также мне нужно обдумать последствия того, что SPA не отдаётся GoogleBot.

Спасибо, что сообщили мне об этом «небольшом факте»…:slight_smile:

(Примечание: я не знал, что «Предлагаемые темы» не отдаются GoogleBot, но теперь знаю… спасибо за информацию).

1 лайк

Мы предоставляем краулерам совершенно другой документ, так как не все краулеры могут выполнять JavaScript, и мы хотим, чтобы Discourse был доступен и для таких клиентов. Даже если они получают уменьшенный функционал, они могут потреблять весь контент.

5 лайков

Большое спасибо, что сообщили мне об этом.

Теперь я понимаю, что некоторые предыдущие обсуждения SPA, «бесконечной прокрутки» и других вопросов, связанных с SEO, были совершенно неверными, поскольку SPA не предоставляется GoogleBot.

Это меняет мой подход к некоторому пользовательскому коду, который я недавно написал; теперь я знаю, что нужно проверять это, используя User-Agent GoogleBot в консоли.

Огромное спасибо за это, @Falco! Очень ценю.

Вопрос:

Какой лучший способ добавить один пользовательский JavaScript-файл в HTML, который рендерится для GoogleBot?

Существует ли «стандартный способ» изменения HTML, предоставляемого ботам?

Причина, по которой я спрашиваю, в том, что у нас есть пользовательский код, созданный в плагине, который я написал (предназначенном для ботов); но я проверил, используя User-Agent GoogleBot в консоли (еще раз спасибо, что подсказали мне это), и GoogleBot не использует ни одной части этого пользовательского кода плагина.

1 лайк

Временно, поскольку я не могу выполнить желаемое в плагине на основе Handlebars для HTML, обслуживаемого для краулеров, мы решили просто удалить канонические теги из Discourse. Это частичное решение на данный момент, пока я не разберусь, как модифицировать канонический тег с помощью JavaScript для веб-краулеров.

Discourse предоставляет удобный механизм для таких изменений в файлах контейнеров yml, поэтому именно это я и сделал сегодня.

Я очень благодарен сообществу Discourse meta за то, что они указали, что приложение Discourse, обслуживаемое для (идентифицированных) краулеров, не совпадает со страницами, обслуживаемыми для пользователей.

Обратите внимание, что я не рекомендую это «временное решение» другим системным администраторам Discourse. Я просто делюсь тем, что решил сделать на данный момент, и тем, как я это сделал (пока мы не придумаем более интересное решение).

2 лайка