Реализация Яндекс Турбо-страниц
Яндекс Турбо — аналог Google AMP для российского рынка. Турбо-страницы генерируются из RSS-ленты специального формата и отображаются прямо в поиске Яндекса на мобильных устройствах. Загружаются значительно быстрее оригинальных страниц благодаря кэшированию на серверах Яндекса.
Формат RSS для Турбо
<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:turbo="http://turbo.yandex.ru" version="2.0">
<channel>
<title>Название сайта</title>
<link>https://example.com</link>
<description>Описание сайта</description>
<item turbo="true">
<title>Заголовок статьи</title>
<link>https://example.com/articles/slug</link>
<pubDate>Mon, 28 Mar 2025 12:00:00 +0300</pubDate>
<author>Имя автора</author>
<turbo:topic>Разработка</turbo:topic>
<turbo:content>
<![CDATA[
<header>
<h1>Заголовок статьи</h1>
<figure>
<img src="https://example.com/img/cover.jpg" alt="Cover"/>
</figure>
</header>
<p>Введение статьи...</p>
<p>Основной текст с <strong>выделенными</strong> словами и
<a href="https://example.com/other-article">ссылками</a>.</p>
<figure>
<img src="https://example.com/img/photo.jpg" alt="Фото"/>
<figcaption>Подпись к фото</figcaption>
</figure>
]]>
</turbo:content>
</item>
</channel>
</rss>
Генерация RSS в Laravel
// TurboFeedController
class TurboFeedController extends Controller
{
public function __invoke(): Response
{
$articles = Article::published()
->with(['author', 'category', 'tags'])
->latest('published_at')
->limit(500) // Яндекс обрабатывает до 500 элементов
->get();
$xml = $this->buildFeed($articles);
return response($xml, 200, [
'Content-Type' => 'application/rss+xml; charset=utf-8',
]);
}
private function buildFeed(Collection $articles): string
{
$dom = new \DOMDocument('1.0', 'UTF-8');
$dom->formatOutput = true;
$rss = $dom->createElement('rss');
$rss->setAttribute('version', '2.0');
$rss->setAttribute('xmlns:turbo', 'http://turbo.yandex.ru');
$dom->appendChild($rss);
$channel = $dom->createElement('channel');
$rss->appendChild($channel);
$this->addElement($dom, $channel, 'title', config('app.name'));
$this->addElement($dom, $channel, 'link', config('app.url'));
$this->addElement($dom, $channel, 'description', 'Статьи и материалы');
foreach ($articles as $article) {
$item = $dom->createElement('item');
$item->setAttribute('turbo', 'true');
$channel->appendChild($item);
$this->addElement($dom, $item, 'title', $article->title);
$this->addElement($dom, $item, 'link', route('articles.show', $article));
$this->addElement($dom, $item, 'pubDate', $article->published_at->toRfc2822String());
$this->addElement($dom, $item, 'author', $article->author->name);
$this->addElement($dom, $item, 'turbo:topic', $article->category->name, 'http://turbo.yandex.ru');
$content = $dom->createElement('turbo:content');
$content->setAttribute('xmlns:turbo', 'http://turbo.yandex.ru');
$cdata = $dom->createCDATASection($this->prepareContent($article));
$content->appendChild($cdata);
$item->appendChild($content);
}
return $dom->saveXML();
}
private function prepareContent(Article $article): string
{
$content = $article->content;
// Удаляем скрипты и нежелательные теги
$content = preg_replace('/<script\b[^>]*>.*?<\/script>/is', '', $content);
$content = preg_replace('/<iframe\b[^>]*>.*?<\/iframe>/is', '', $content);
$content = preg_replace('/\s*class\s*=\s*["\'][^"\']*["\']/i', '', $content);
return "<header><h1>{$article->title}</h1></header>{$content}";
}
private function addElement(\DOMDocument $dom, \DOMNode $parent, string $tag, string $value, ?string $ns = null): void
{
$el = $ns ? $dom->createElementNS($ns, $tag) : $dom->createElement($tag);
$el->appendChild($dom->createTextNode($value));
$parent->appendChild($el);
}
}
Маршрут и кэширование
// routes/web.php
Route::get('/turbo-feed.xml', TurboFeedController::class)->name('turbo.feed');
// С кэшированием на 30 минут
public function __invoke(): Response
{
$xml = Cache::remember('turbo_feed', 1800, fn() => $this->buildFeed(/* ... */));
return response($xml, 200, ['Content-Type' => 'application/rss+xml; charset=utf-8']);
}
Подключение в Яндекс Вебмастере
- Добавить сайт в Яндекс Вебмастер
- Перейти в «Контент» → «Турбо-страницы»
- Указать URL RSS-ленты:
https://example.com/turbo-feed.xml - Дождаться индексации (1–3 дня)
Аналитика Турбо-страниц
Яндекс.Метрика автоматически отслеживает Турбо-трафик как отдельный сегмент. В Яндекс Вебмастере доступна статистика просмотров и ошибок парсинга.
Сроки
Генерация Турбо-RSS-ленты с кэшированием и интеграция с Яндекс Вебмастером: 1–2 рабочих дня.







