Реализация Turbo-страниц (Яндекс) для сайта

Наша компания занимается разработкой, поддержкой и обслуживанием сайтов любой сложности. От простых одностраничных сайтов до масштабных кластерных систем построенных на микро сервисах. Опыт разработчиков подтвержден сертификатами от вендоров.
Разработка и обслуживание любых видов сайтов:
Информационные сайты или веб-приложения
Сайты визитки, landing page, корпоративные сайты, онлайн каталоги, квиз, промо-сайты, блоги, новостные ресурсы, информационные порталы, форумы, агрегаторы
Сайты или веб-приложения электронной коммерции
Интернет-магазины, B2B-порталы, маркетплейсы, онлайн-обменники, кэшбэк-сайты, биржи, дропшиппинг-платформы, парсеры товаров
Веб-приложения для управления бизнес-процессами
CRM-системы, ERP-системы, корпоративные порталы, системы управления производством, парсеры информации
Сайты или веб-приложения электронных услуг
Доски объявлений, онлайн-школы, онлайн-кинотеатры, конструкторы сайтов, порталы предоставления электронных услуг, видеохостинги, тематические порталы

Это лишь некоторые из технических типов сайтов, с которыми мы работаем, и каждый из них может иметь свои специфические особенности и функциональность, а также быть адаптированным под конкретные потребности и цели клиента

Предлагаемые услуги
Показано 1 из 1 услугВсе 2065 услуг
Реализация Turbo-страниц (Яндекс) для сайта
Средняя
~2-3 рабочих дня
Часто задаваемые вопросы
Наши компетенции:
Этапы разработки
Последние работы
  • image_website-b2b-advance_0.png
    Разработка сайта компании B2B ADVANCE
    1214
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1161
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    852
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1041
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    823
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Разработка веб-сайта для компании ФИКСПЕР
    815

Реализация Яндекс Турбо-страниц

Яндекс Турбо — аналог 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']);
}

Подключение в Яндекс Вебмастере

  1. Добавить сайт в Яндекс Вебмастер
  2. Перейти в «Контент» → «Турбо-страницы»
  3. Указать URL RSS-ленты: https://example.com/turbo-feed.xml
  4. Дождаться индексации (1–3 дня)

Аналитика Турбо-страниц

Яндекс.Метрика автоматически отслеживает Турбо-трафик как отдельный сегмент. В Яндекс Вебмастере доступна статистика просмотров и ошибок парсинга.

Сроки

Генерация Турбо-RSS-ленты с кэшированием и интеграция с Яндекс Вебмастером: 1–2 рабочих дня.