Skip to content

SEO

SEO Blocks System

Архитектура

  • Таблица seo_blocks: page_type + position + format (html/faq/text)
  • Шаблоны с переменными в фигурных скобках: {city}, {category_gen}, {price}
  • SeoService::render(pageType, position, context) — подставляет переменные, возвращает коллекцию
  • Blade-компонент <x-seo-blocks> — вызывает SeoService

Переменные шаблонов

ПеременнаяЗначение
{city}Город (именительный)
{city_gen}, {city_dat}, {city_prep}Город в падежах
{category}, {category_gen}Категория
{brand}Бренд
{service}Услуга
{location}Район/локация
{price}Цена "от X руб."
{year}Текущий год

Positions

  • top — после H1, перед основным контентом
  • bottom — после контента, перед footer
  • sidebar — боковая панель (если есть)

Formats

  • html — произвольный HTML (описание, преимущества)
  • faq — вопрос-ответ, обёрнут в Schema.org FAQPage
  • text — plain text, автоформатирование параграфов

Meta-теги

Обязательные на каждой странице

  • <title> — уникальный, до 60 символов, ключевое слово в начале
  • <meta name="description"> — уникальный, до 160 символов, call-to-action
  • <link rel="canonical"> — всегда, даже на единственной версии URL
  • Open Graph: og:title, og:description, og:url, og:type

Приоритет мета-данных

  1. seo_meta таблица (ручное переопределение для конкретной страницы)
  2. Шаблон с подстановкой переменных (автогенерация по формуле)
  3. Default из модели (name / description)

H1

  • Один <h1> на страницу — без исключений
  • Может отличаться от <title> (более подробный/с городом)
  • Иерархия: h1 → h2 → h3, не пропускать уровни

Schema.org (JSON-LD)

Обязательные типы

Тип страницыSchema.org type
Все страницыOrganization или LocalBusiness
Все страницыBreadcrumbList (через компонент breadcrumbs)
FAQ-блокиFAQPage + Question + Answer
УслугиService + provider + areaServed
КонтактыLocalBusiness с address, phone, geo

Правила

  • JSON-LD в <script type="application/ld+json"> — не microdata
  • Один @type на блок — не мешать несколько типов
  • Данные из моделей, не хардкод — чтобы обновлялись при изменении

Sitemap

Генерация

  • spatie/laravel-sitemap или кастомный SitemapService
  • Artisan-команда: php artisan sitemap:generate
  • Запуск: при деплое + ежедневно по cron

Приоритеты

ТипPriorityChangeFreq
Главная1.0daily
Категории0.8weekly
Сущности (услуги, товары)0.6monthly
Справочник, статические0.4monthly

Исключить из sitemap

  • Admin (/admin/*)
  • API (/api/*)
  • Auth-страницы
  • Error-страницы
  • Страницы с noindex

robots.txt

Обязательные правила:

  • Disallow: /admin
  • Disallow: /api/
  • Sitemap: https://domain.com/sitemap.xml
  • Не блокировать CSS/JS файлы — нужны для рендеринга

URL-правила

  • Все URL — lowercase
  • Slugs — только [a-z0-9-], без спецсимволов и кириллицы
  • Trailing slash — единая конвенция в проекте (обычно с /)
  • При изменении URL — 301 redirect со старого на новый, навсегда
  • Никогда не менять URL без явного одобрения
  • Canonical — всегда на предпочтительную версию (с или без trailing slash)

Anti-patterns

ПаттернПроблемаРешение
Одинаковый title на всех страницахДубли в индексе, плохой CTRУникальный title с переменными
Отсутствие canonicalДубли URL в индексеCanonical на каждой странице
H1 = titleУпущенная возможность для другого ключаH1 может быть подробнее
Несколько H1 на страницеНарушение семантикиОдин H1
Schema.org хардкодомУстаревает при изменении данныхДанные из моделей
sitemap с 404-страницамиПлохой сигнал поисковикамГенерировать из актуальных данных
Блокировка CSS/JS в robots.txtGoogle не может рендерить страницуРазрешить статику

Внутренняя база знаний студии