Яндекс турбо-страницы: В содержимом тега CDATA найдены закодированные символы
Пару дней назад подключил к этому блогу Яндекс турбо-страницы и добавил фид в Яндекс Вебмастер. Спустя какое-то время, увидел, что в разделе "Турбо страницы > Источники" есть довольно много однотипных предупреждений "Cодержимое Турбо-страницы не соответствует оригинальной версии (в содержимом тега найдены закодированные символы". Решил разобраться в чем проблема...
Проблема
Выглядит ошибка вот так
Справка по ошибкам, которую можно найти тут "Часто встречающиеся ошибки RSS-канала" (https://yandex.ua/support/webmaster/turbo/troubleshooting.html), ясности не внесла.
Поиск ошибки
Для того, чтобы понять в чем проблема, нужно скопировать код фида статьи и вставить в валидатор который находится в разделе Яндекс.Вебмастера "Турбо-страницы > Отладка"
Немного поигравшись с кодом, я обнаружил, что валидатор ругается на экранированные закрытые тэги, упрощенный пример такого кода:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<item turbo="true"> <title>Заголовок страницы</title> <link>https://it-rem.phpdev.one</link> <turbo:content> <![CDATA[ <pre class="crayon-plain-tag"> </example> </pre> ]]> </turbo:content> </item> |
Проблема стала ясна: Яндекс хотел, чтобы в фиде не кодировали html, для этого ввели валидацию по экранированным закрывающимся тэгам (вероятнее всего по регулярке "~</\s*\S+\s*>~"). Все бы хорошо, если бы не блоги с исходным кодом, в которых встречаются примеры исходников. Например, в моем случае, ошибки нет и кодированный тэг должен быть именно кодированным, т.к. это не тэг страницы, а тэг исходного кода - т.е., по свое сути это текст, а не тэг.
Могу конечно ошибаться, но валидатор не пройдет любая страница содержащая исходный код с закрывающимся тэгом: любой html, xml, конфиг virtualhost апача и все в таком роде, это миллионы страниц.
Решение
Я описал проблему и написал в поддержку Яндекса, с детальным описанием и предложением отключить валидацию внутри тегов <pre> и <code>, которые всеми используются для отображения исходных кодов. Теперь жду ответа, как они и рекомендуют.
Для тех, кому срочно нужно выйти из ситуации, рекомендую просто добавить пробел перед слешем, это повредит тэг, тем самым вы пройдете валидатор, но при копировании такого исходника с вашей страницы, пользователи скопируют и пробел - тем самым это может внести проблемы при использовании скопированного фрагмента. Пример валидного кода, с пробелом:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<item turbo="true"> <title>Заголовок страницы</title> <link>https://it-rem.phpdev.one</link> <turbo:content> <![CDATA[ <pre class="crayon-plain-tag"> < /example> </pre> ]]> </turbo:content> </item> |
Как видите, такой код без проблем проходит валидацию
Будьте внимательны
Изучая проблему, я наткнулся на этот пост "Редактирование турбо страниц для Яндекса в WordPress" (https://www.baf.ru/2018/04/19/generacija-turbo-stranic-dlja-jandeksa-v-wordpress-e), там описано решение, при котором "невалидные символы", конвертируют обратно в html.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
//удаляем все unicode-символы (как невалидные в rss) $content = preg_replace('/[\x00-\x1F\x7F]/u', '', $content); $content = preg_replace('/«/', '"', $content); $content = preg_replace('/»/', '"', $content); $content = preg_replace('/'/', '\'', $content); $content = preg_replace('/ /', ' ', $content); $content = preg_replace('/—/', '-', $content); $content = preg_replace('/&/', '&', $content); $content = preg_replace('/</', '<', $content); $content = preg_replace('/>/', '>', $content); //удаляем все атрибуты тега img кроме alt и src $content = yturbo_strip_attributes($content,array('alt','src')); $content = wpautop($content); |
Для простых текстовых статей/комментариев, это подойдет. Но, в случае с исходным кодом, такой подход грозит XSS уязвимостями, т.к. такой безобидный исходный код:
1 2 3 4 5 6 7 |
<code> <script> alert('XSS'); </script> </code> |
будет конвертирован в следующее
1 2 3 4 5 6 7 |
<code> <script> alert('XSS'); </script> </code> |
А это уже потенциальная уязвимость, поэтому, будьте внимательны.
--[добавлено 20.07.2018]--
Сегодня получил ответ от команды Яндекса, пообещали разобраться. Так же заметили, что несмотря на предупреждения валидатора турбо версия страницы находится в индексе, т.е. если у Вас похожая проблема, то не спешите расстраиваться по поводу того, что турбо-страницу не проиндексируют.
Так же в письме был пример на проверку турбо страницы, ссылка в таком формате:
https://yandex.ru/turbo?text=<url>
При необходимости с помощью этой ссылки можно проверить свою страницу, например: турбо версия этой страницы - https://yandex.ru/turbo?text=https://it-rem.phpdev.one/yandeks-turbo-stranitsyi-v-soderzhimom-tega-cdata-naydenyi-zakodirovannyie-simvolyi.html
Author: | Tags: /
| Rating:
2 comments.
Write a comment