Что такое XML сайт
XML сайт это сайт, страницы которого являются простыми XML файлами с MIME типом "text/xml" "application/xml"(XML Media Types). Они содержат только уникальные данные для этой страницы.
В таком XML файле задаётся ссылка на XSLT шаблон, который преобразует XML в HTML или в XHTML в браузере пользователя.
Проблема
Для классических html веб страниц поисковики в качестве заголовка отображают содержимое тега title
. В описании отображается кусочки текста с найденными ключевыми словами или содержимое тега meta
description
.
Поисковики обычно не исполняют скрипты на страницах которые индексируют и соответственно не видят конечный вариант страницы после их исполнения. Соответственно они не видят теги title
и meta
которые вставляются XSLT шаблоном. Они индексируют текст который есть в XML документе как есть.
Решение
Наша задача правильно добавить теги title
и meta
в XML чтобы браузер, поисковик и меседжер в котором отправляется ссылка на страницу их понимали.
Таким же образом можно будет добавить и другие HTML теги для поисковиков, меседжеров и даже браузера если он вдруг не исполнит XSLT шаблон.
Как страница отображается без тегов
Например у нас такой XML:
<запись>
<заголовок>Текст заголовка</заголовок>
<текст>Текст записи</текст>
</запись>
Как он отображается в поиске без title
и meta
тегов:
- XML показывается в одну строку (Гугл)
Заголовок:<запись><заголовок>Текст заголовка</заголовок><текст>...
Описание:<запись><заголовок>Текст заголовка</заголовок><текст>Текст записи</текст></запись>
- Сокращённый вариант (duckduckgo.com)
Заголовок:example.com
Описание:запись>заголовок>Текст заголовка...
- Только содержимое тегов в загаловке (startpage.com)
Заголовок:Текст заголовка Текст записи
- Страница не отображается в поиске (Яндекс)
Я запускал несколько раз переиндексацию страницы но яндексу упорно не нравился mime тип страницы. Потом когда я начал писать эту статью они мне прислали увидомление что добавили в поиск. Но сегодня страница снова исчезла из поиска.
Вставляем теги
Для того чтобы вставить теги title и meta в xml и при этом браузер и поисковик понимали что это html теги им надо задать пространство имён "http://www.w3.org/1999/xhtml".
Варианты вставки:
Задать префикс для html тегов.
<!-- родительском элементе объявляем префикс 'xh' для xhtml элементов --> <запись xmlns:xh="http://www.w3.org/1999/xhtml"> <!-- далее используем этот префикс перед именем элемента --> <xh:title>Текст заголовка для страницы поиска и меседжеров</xh:title> <xh:meta name ="description" content="Часть текста записи для страницы поиска и меседжеров"/> <!-- у элементов без префикса пространство имён остаётся пустым --> <заголовок>Текст заголовка</заголовок> <текст>Текст записи</текст> </запись>
Этот вариант самый краткий но выяснилось что Гугл его не понимает.
UPD (04.08.2020): Похоже Гугл таки понял данный вариант но задал пока только заголовок.
UPD (26.08.2020): Яндекс применил тестовым XML страницам с
<!DOCTYPE html>
шаблон и взял заголовок и описание из результата. Тестовые страницы появились в результатах поиска Яндекса.
Обернуть в элемент с заданным пространством имён поумолчанию.
<запись> <!-- в теге head определяем пространство имён поумолчанию --> <head xmlns="http://www.w3.org/1999/xhtml"> <!-- все дочерние элементы наследуют это пространство имён --> <title>Текст заголовка</title> <meta name="description" content="Часть текста записи для страницы поиска и меседжеров"/> </head> <!-- элементы вне тега head остаются с пустым пространством имён --> <заголовок>Текст заголовка</заголовок> <текст>Текст записи</текст> </запись>
Тут пространство имён поумолчанию задаётся в родительском элементе и распространяется на дочерние.
Гугл понял такой вариант и использовал текст из
title
в качестве заголовка и текст изmeta description
в качестве описания страницы.
UPD (04.08.2020): В этом варианте на тестовых страницах Гугл задал заголовок и описание после применения XSLT шаблона.
UPD (20.08.2020): После добавления
<!DOCTYPE html>
на тестовых страницах Яндекс взял информацию изtitle
иmeta description
но посчитал страницу не достаточно качественной.
С этим вариантом возникает проблема на web.archive.org. Архив в данном виде воспринимает страницу как html и пихает в неё свои теги "поправляя" те теги которых не знает. В результате документ перестаёт быть правильным XML и не отображается.
Пример работы web.archive.org над этим вариантом.
<запись> <head xmlns="http://www.w3.org/1999/xhtml"><script ...</script> <title>Текст заголовка</title> <meta name="description" content="Часть текста записи для страницы поиска и меседжеров"/> </head> <заголовок>Текст заголовка</заголовок> <текст>Текст записи</текст> </запись>
Задать пространство имён поумолчанию каждому элементу индивидуально.
<запись> <!-- задаём пространство имён каждому элементу индивидуально --> <title xmlns="http://www.w3.org/1999/xhtml">Текст заголовка</title> <meta name="description" content="Часть текста записи для страницы поиска и меседжеров" xmlns="http://www.w3.org/1999/xhtml"/> <!-- остальные элементы остаются с пустым пространством имён --> <заголовок>Текст заголовка</заголовок> <текст>Текст записи</текст> </запись>
Данный способ хорош когда нам нужен только один элемент из этого пространства имён и мы можем указать его пространство имён прям в нём.
Этот вариант я только поставил на тест так что результат отображения в Гугле не известен.
UPD (27.07.2020): На живом сайте в таком варианте Гугл подхватил заголовок. Описание осталось пустым. Я решил попробовать переместить xmlns в конец meta тега чтобы он больше был похож на обычный html. Ждём следующей переиндексации.
UPD (04.08.2020): На тестовых страницах Гугл задал заголовок до применения XSLT шаблона а описание после его применения.
UPD (10.08.2020): На живом сайте в этом варианте Бинг корректно отображает заголовок и описание.
UPD (20.08.2020): После добавления
<!DOCTYPE html>
на тестовых страницах Яндекс взял информацию изtitle
иmeta description
но посчитал страницу не достаточно качественной. На живом сайте он также задал название и описание страницы и отобразил страницу в поиске.
UPD (26.08.2020): Яндекс применил тестовым XML страницам с
<!DOCTYPE html>
шаблон и взял заголовок и описание из результата. Тестовые страницы появились в результатах поиска Яндекса.
Шаблон
После проведения всех экспериментов итоговый шаблон XML у меня такой:
<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet href="style.css" type="text/css" ?>
<?xml-stylesheet href="style.xsl" type="text/xsl" ?>
<!DOCTYPE html>
<корень>
<title xmlns="http://www.w3.org/1999/xhtml">[Заголовок страницы]</title>
<meta name="description" content="[Описание страницы]" xmlns="http://www.w3.org/1999/xhtml" />
<meta name="keywords" content="[ключевые слова]" xmlns="http://www.w3.org/1999/xhtml" />
<!-- содержимое XML документа -->
</корень>
Отдаётся документ с MIME типом "application/xhtml+xml" для Гугла и директивой <!DOCTYPE html>
для Яндекса чтоб они исполнили XSLT шаблон на странице.
Результат
После правильной вставки тегов title
и meta
в результатах поиска после переиндексации страницы она появляется уже с заданным заголовком и описанием. Также после отправки ссылки на сайт в сообщении подгружается её заголовок и описание.
Ссылки
Страница с ссылками на примеры: ivan386.github.io/xml-site-index-test/
Примеры я создал сегодня(10.07.2020). Надо подождать пока поисковики их проиндексируют.
UPD (27.07.2020): На данный момент только Бинг показывает одну из XML в результатах поиска. Это первый вариант XML и Бинг также как и Гугл не увидел в ней заголовка и описания. Возможно поскольку мало текста в самих XML документах поисковики неохотно их показывают и они задержались в песочнице.
UPD (04.08.2020): Гугл наконец то показал некоторые тестовые страницы в поиске. Я за это время их сделал много. На некоторых он даже применил XSLT шаблон и взял заголовок и описание после применения.
UPD (20.08.2020): После добавления тестовым XML страницам <!DOCTYPE html>
Яндекс прочитал на некоторых заголовок и описание но решил не отображать их в поиске так как посчитал их не качественными. При тестировании этого метода на живом сайте он таки появился в поиске Яндекса с правильным названием и описанием.
UPD (26.08.2020): Яндекс применил тестовым XML страницам с <!DOCTYPE html>
шаблон и взял заголовок и описание из результата. Тестовые страницы появились в результатах поиска Яндекса.
Эти страницы в Гугле: site:ivan386.github.io/xml-site-index-test/
Эти страницы в Яндексе: site:ivan386.github.io/xml-site-index-test/
Эти страницы в Бинг: site:ivan386.github.io/xml-site-index-test/
Эти страницы в DuckDuckGo: site:ivan386.github.io/xml-site-index-test/