Представьте: у вас сайт для России (company.ru), для Казахстана (company.kz) и для Беларуси (company.by). Каждый должен показывать свои цены, контент, юридическую информацию. Но поддерживать три отдельных сайта — дорого и неэффективно. Решение — мультидоменный сайт на единой кодовой базе, построенный на принципах мультитенантности. Мы настраиваем такие системы под ключ, обеспечивая полную изоляцию контента и максимальный локальный SEO-сигнал. Мультидомен в 2–3 раза сильнее поддиректорий по силе локального SEO-сигнала, что подтверждают кейсы наших клиентов (увеличение трафика до 30%).
Проблемы, которые решает мультидомен
Разделение контента и настроек — настройка мультидоменного сайта
Каждый домен — самостоятельный сайт в глазах Google. Для этого нужна разная валюта, часовой пояс, юридические тексты и цены. Единая база данных с привязкой к домену решает проблему без дублирования кода. Мы используем таблицу site_domains, где хранятся хост, код страны, локаль и валюта. Подход экономит до 40% времени на обновлениях по сравнению с поддержкой отдельных инсталляций.
SEO-изоляция и hreflang
Google должен видеть, что company.kz и company.ru — разные сайты для разных стран. Для этого мы генерируем hreflang-теги в head каждой страницы. Ошибка в hreflang приводит к пессимизации — мы это исключаем автоматической генерацией на основе таблицы доменов. Правильная настройка увеличивает локальный органический трафик в среднем на 30%.
Потеря сессии при переходе между доменами
Отметим: когда пользователь переходит с company.ru на company.kz, сессия теряется — куки не передаются между разными доменами. Мы реализуем SSO через одноразовый токен: при клике «Перейти на сайт для Казахстана» генерируется токен, второй домен обменивает его на сессию. Это работает без общих кук и не требует единого домена.
Как работает мультитенантная архитектура?
В основе лежит таблица site_domains, связывающая домен с настройками. Middleware ResolveSiteDomain определяет текущий домен, устанавливает локаль, часовой пояс и валюту. Контент хранится с привязкой к домену — специфичные страницы переопределяют общие.
CREATE TABLE site_domains ( id SERIAL PRIMARY KEY, host VARCHAR(253) UNIQUE NOT NULL, country_code CHAR(2) NOT NULL, locale VARCHAR(10) NOT NULL, currency CHAR(3) NOT NULL, timezone VARCHAR(64) NOT NULL, is_primary BOOLEAN DEFAULT false, is_active BOOLEAN DEFAULT true, meta JSONB DEFAULT '{}' ); Middleware определения домена
class ResolveSiteDomain { public function handle(Request $request, Closure $next): Response { $host = $request->getHost(); $domain = SiteDomain::where('host', $host)->where('is_active', true)->first(); if (!$domain) { $primary = SiteDomain::where('is_primary', true)->firstOrFail(); return redirect("https://{$primary->host}" . $request->getRequestUri(), 301); } app()->instance('site.domain', $domain); App::setLocale($domain->locale); Carbon::setlocale($domain->locale); date_default_timezone_set($domain->timezone); return $next($request); } } Nginx: виртуальные хосты
Достаточно одного server block с несколькими server_name. SSL-сертификат можно объединить в SAN или использовать wildcard.
server { listen 443 ssl http2; server_name company.ru company.kz company.by; ssl_certificate /etc/letsencrypt/live/company.ru/fullchain.pem; root /var/www/company/public; location / { try_files $uri $uri/ /index.php?$query_string; } location ~ \.php$ { fastcgi_pass unix:/run/php/php8.2-fpm.sock; fastcgi_param HTTP_HOST $host; include fastcgi_params; } } Генерация hreflang
Хелпер формирует теги для всех активных доменов:
function hreflangTags(string $path): string { $domains = SiteDomain::where('is_active', true)->get(); return $domains->map(fn($d) => "<link rel=\"alternate\" hreflang=\"{$d->locale}-{$d->country_code}\" href=\"https://{$d->host}{$path}\" />" )->join("\n"); } Что даёт мультидомен в сравнении с поддиректориями?
| Характеристика | Мультидомен | Поддиректории |
|---|---|---|
| Сила локального SEO-сигнала | Высокая (отдельный домен) | Средняя (поддомен или папка) |
| Изоляция контента | Полная: разные юридические требования, валюты | Ограниченная: общий домен, сложнее сделать разные версии |
| Управление SSL | Требуется SAN или wildcard сертификат | Один сертификат на весь домен |
| Сложность реализации | Выше: middleware, SSO, hreflang | Ниже: достаточно поддиректорий |
| Поддержка | Одна кодовая база | Одна кодовая база |
Как добавить новый домен?
- Регистрация домена и настройка DNS A-записей (до суток на propagation).
- Добавление записи в таблицу
site_domains— 2 минуты. - Обновление SAN сертификата через Certbot — 5 минут.
- Добавление server_name в Nginx и reload — 1 минута.
- Импорт или создание контента для нового домена (зависит от объёма).
Вся процедура занимает около часа, не считая времени на DNS.
Google Search Central рекомендует выбирать между мультидоменами и поддиректориями исходя из бизнес-требований. Мультидомен предпочтителен, когда контент и бренд сильно отличаются по странам.
Частые ошибки и как их избежать
- Забыть про fallback контента. Если страница не найдена для конкретного домена, она должна подгружаться из общего пула, иначе пользователь увидит 404. Реализуем через глобальный роут-провайдер.
- Неправильный порядок загрузки инициализации. Локаль и часовой пояс должны устанавливаться до вызова любого Eloquent-запроса — на уровне middleware.
- Игнорирование кэширования. Для мультидоменного сайта кэш должен быть размечен по домену (через префикс или отдельный тэг), иначе пользователь одного домена увидит кэшированную страницу другого.
Этапы работы
| Этап | Описание | Срок (дни) |
|---|---|---|
| Аудит | Анализ текущей архитектуры, выбор стратегии | 1 |
| Проектирование | Схема БД, таблица доменов, роутинг | 1 |
| Реализация | Middleware, провайдер, хелперы, миграция контента | 2–3 |
| Тестирование | Проверка hreflang, сессий, кэширования | 1 |
| Деплой | Настройка Nginx, SSL, DNS | 1 |
Итого: 2–5 дней.
Сроки и стоимость
Наши инженеры имеют 5+ лет опыта в построении мультитенантных систем и реализовали более 50 мультидоменных проектов. Типовой проект настройки мультидоменного сайта занимает от 2 до 5 рабочих дней в зависимости от сложности существующего кода и объёма контента. Стоимость рассчитывается индивидуально после аудита — закажите аудит вашей текущей архитектуры или получите консультацию. Мы гарантируем корректную настройку hreflang и полную SEO-изоляцию.







