Если проект на 1С-Битрикс предполагает работу с поддоменами городов, необходимо грамотно организовать маршрутизацию через urlrewrite.php. Это позволит корректно обрабатывать запросы по поддоменам и передавать управление нужным компонентам или страницам.
Битрикс по умолчанию не различает поддомены, если они не обрабатываются на уровне сервера или через дополнительную логику в init.php. Однако можно реализовать поддержку поддоменов без изменения структуры проекта, используя правила в urlrewrite.php и настройку веб-сервера.
Перед добавлением правил, нужно убедиться, что DNS для каждого города указывает на один и тот же IP-адрес. На стороне сервера – настроить wildcard-домен (например, *.site.ru). В случае с nginx добавляется блок server_name ~^(?
В самом проекте желательно сохранять имя поддомена в сессии или в глобальной переменной, а также переопределить корневой маршрут в urlrewrite.php так, чтобы он учитывал текущий город. Например, можно направить все запросы на один и тот же скрипт, где будет выполняться логика подстановки контента в зависимости от города.
Также потребуется модифицировать компонент catalog.section или news, если контент зависит от региона. Это можно реализовать через фильтрацию по значению свойства «Город», которое определяется по текущему поддомену. Подмена метатегов, заголовков и хлебных крошек также должна опираться на имя поддомена, чтобы избежать дублирования и проблем с SEO.
Создание поддоменов для городов на уровне DNS и веб-сервера
Для корректной работы поддоменов типа spb.example.ru, kazan.example.ru и т.д., необходимо внести изменения в DNS-зону домена. Если используется DNS-провайдер (например, Cloudflare, Yandex или reg.ru), создаётся запись типа A или CNAME:
1. А-запись: если поддомены должны указывать на конкретный IP-адрес сервера, создаётся запись вида *.example.ru A 192.0.2.1. Звёздочка позволяет охватить все возможные поддомены.
2. CNAME-запись: если сервер обрабатывает поддомены через основное имя, используется *.example.ru CNAME example.ru.
На стороне веб-сервера (Apache или Nginx) необходимо обеспечить обработку поддоменов. В Apache в конфигурации виртуального хоста указывается:
<VirtualHost *:80> ServerAlias *.example.ru DocumentRoot /var/www/example ... </VirtualHost>
Для Nginx конфигурация может выглядеть так:
server { listen 80; server_name ~^(?[a-z0-9\-]+)\.example\.ru$; root /var/www/example; ... }
В обоих случаях веб-сервер должен быть настроен на извлечение имени поддомена и передачу его в Битрикс. В Nginx это можно сделать через переменную $city, которую передают в PHP с помощью:
fastcgi_param CITY $city;
В Apache переменную можно пробросить через модуль mod_rewrite с использованием RewriteCond и SetEnv.
После этого в init.php Битрикс можно обработать значение, определяя текущий город, основываясь на имени поддомена. Без настроек DNS и веб-сервера URL-rewrite работать не будет, так как запрос просто не достигнет PHP.
Настройка структуры каталогов для мультидоменной логики
Для реализации мультидоменной схемы с поддоменами городов в Битрикс необходимо изначально выстроить физическую структуру каталогов, учитывая особенности маршрутизации и изоляции контента.
Создавать отдельные корневые директории для каждого поддомена (kazan.site.ru, ufa.site.ru и т.д.) нецелесообразно. Вместо этого следует использовать единую точку входа – /index.php и управлять маршрутизацией через urlrewrite.php и обработчики событий, определяющие город по поддомену.
Контент должен храниться в общей структуре, например: /cities/kazan/, /cities/ufa/. Это упрощает обновление шаблонов и исключает дублирование. В urlrewrite.php прописываются правила, которые направляют запросы с поддоменов на соответствующие разделы:
‘CONDITION’ => ‘#^/#’,
‘RULE’ => ‘city=kazan’,
‘ID’ => »,
‘PATH’ => ‘/cities/index.php’
Файл /cities/index.php определяет город по параметру $_GET[‘city’] или через глобальную переменную, установленную в init.php на основе поддомена. Далее происходит подключение соответствующего шаблона или фильтрации данных.
Для хранения шаблонов и компонентов по городам используйте директории /local/templates/city_kazan/, /local/components/city_kazan/ и т.д. Подключение нужного шаблона можно реализовать через define(«SITE_TEMPLATE_ID», «city_kazan»); в init.php или с помощью условия в компоненте.
Избегайте создания отдельных сайтов в административной части Битрикс – это усложнит поддержку. Вместо этого используйте один сайт с поддоменами и обрабатывайте логику через PHP и настройки веб-сервера.
Добавление правил в urlrewrite.php для маршрутизации поддоменов
Для корректной маршрутизации поддоменов в Битрикс необходимо вручную добавить правила в файл urlrewrite.php
, расположенный в корне сайта. Каждый поддомен должен быть привязан к определённому городу, а правило – к соответствующему обработчику.
Пример добавления правила для поддомена kazan.site.ru
, перенаправляющего на компонент отображения города:
array(
"CONDITION" => "#^/#",
"RULE" => "",
"ID" => "",
"PATH" => "/city/index.php",
"SITE_ID" => "s1",
"DOMAIN" => "kazan.site.ru"
),
Поле DOMAIN
не используется по умолчанию в стандартной структуре urlrewrite.php
, его можно ввести вручную и учитывать в пользовательском роутере в init.php
. При этом желательно использовать дополнительную проверку $_SERVER['HTTP_HOST']
на соответствие шаблону поддомена.
Для автоматизации можно использовать функцию, добавляющую правила программно:
function AddCityRewriteRule($cityCode, $domain) {
$rule = array(
"CONDITION" => "#^/#",
"RULE" => "city=$cityCode",
"ID" => "",
"PATH" => "/city/index.php",
"SITE_ID" => "s1"
);
$file = $_SERVER["DOCUMENT_ROOT"] . "/urlrewrite.php";
if (file_exists($file)) {
include($file);
global $arUrlRewrite;
$arUrlRewrite[] = $rule;
file_put_contents($file, "<?php\n\$arUrlRewrite = " . var_export($arUrlRewrite, true) . ";\n?>");
}
}
Подключение маршрута на основе поддомена можно реализовать в /bitrix/php_interface/init.php
:
if (preg_match('/^([a-z0-9-]+)\.site\.ru$/', $_SERVER['HTTP_HOST'], $matches)) {
$_GET['city'] = $matches[1];
include_once $_SERVER['DOCUMENT_ROOT'] . '/city/index.php';
die();
}
Файл urlrewrite.php
не обрабатывает поддомены автоматически. Для поддержки мультисайтовой структуры с разными поддоменами рекомендуется использовать либо многосайтовость Битрикс (с разными SITE_ID), либо обрабатывать маршруты вручную, как показано выше.
Определение текущего города по HTTP_HOST в init.php
Для корректной работы urlrewrite и подстановки данных по городу, необходимо определить поддомен на этапе инициализации. Это делается в файле /bitrix/php_interface/init.php
.
Пример базового кода:
$host = $_SERVER['HTTP_HOST'];
$hostParts = explode('.', $host);
$subdomain = strtolower($hostParts[0]);
$availableCities = ['msk', 'spb', 'kzn', 'nsk'];
if (in_array($subdomain, $availableCities)) {
define('CURRENT_CITY_CODE', $subdomain);
} else {
define('CURRENT_CITY_CODE', 'msk'); // город по умолчанию
}
Рекомендуется:
- Проверять, что
$_SERVER['HTTP_HOST']
не пуст, иначе логировать ошибку или задавать поддомен по умолчанию. - Сохранять соответствие поддоменов и городов в отдельном конфигурационном файле или кэшировать в настройках.
- Не использовать IP-определение, если поддомены уже структурированы по городам – это снижает сложность.
После определения константы CURRENT_CITY_CODE
её можно использовать для подгрузки данных: складов, цен, офферов, контактных телефонов. Также она может применяться в правиле urlrewrite через условие типа '#^/catalog/#'
с привязкой к массиву правил внутри urlrewrite.php
.
Связывание поддоменов с данными инфоблоков или highload-блоков
На основе кода можно получить данные из инфоблока с типом «cities» или из highload-блока. Для инфоблока выполняется запрос через CIBlockElement::GetList с фильтром [‘CODE’ => $subdomain]. В случае highload-блока необходимо получить сущность через Bitrix\Highloadblock\HighloadBlockTable и выполнить getList с аналогичным фильтром.
Пример кода для highload-блока:
use Bitrix\Highloadblock\HighloadBlockTable;
use Bitrix\Main\Entity;
$subdomain = explode('.', $_SERVER['HTTP_HOST'])[0];
$hlblock = HighloadBlockTable::getById(1)->fetch(); // ID блока с городами
$entity = HighloadBlockTable::compileEntity($hlblock);
$entityClass = $entity->getDataClass();
$city = $entityClass::getList([
'filter' => ['UF_CODE' => $subdomain]
])->fetch();
if (!$city) {
LocalRedirect('https://site.ru/');
}
Полученные данные можно сохранять в global $APPLICATION или использовать в компоненте через setPageProperty для генерации мета-тегов, заголовков и контента.
Для кеширования рекомендуется использовать Bitrix\Main\Data\Cache или CPHPCache с ключом, включающим код поддомена. Это снижает нагрузку при множестве поддоменов.
Жёсткое связывание по UF_CODE или CODE исключает ошибки при использовании адресов, не соответствующих структуре данных.
Организация кеширования с учётом разных поддоменов
В проектах на Битрикс с поддоменами для городов необходимо учитывать, что кеш должен быть сегментирован по поддоменам. Иначе при смене города пользователи будут видеть данные, относящиеся к другому региону.
Основные рекомендации для настройки кеша:
- Использовать уникальный ключ кеша, включающий поддомен. Например, для кеша компонента добавить в ключ $_SERVER[‘HTTP_HOST’].
- В системах кеширования на уровне nginx или Apache включать Vary по хосту, чтобы CDN и прокси правильно различали версии.
- При работе с кешем Битрикс задать параметр CACHE_KEY так, чтобы он учитывал текущий поддомен, например,
md5($_SERVER['HTTP_HOST'] . $arParams['CACHE_ID'])
. - Для кеша страниц использовать механизм «Переменные кеша» (Managed Cache) с учетом поддомена – так изменится хеш для каждого региона.
- Если используется кеширование на стороне клиента (например, HTTP Cache-Control), добавить заголовок Vary: Host.
Технические нюансы:
- При динамическом формировании URLRewrite учитывать поддомен в параметрах, чтобы кешированные маршруты соответствовали конкретному городу.
- При использовании комплексных компонентов проверять, что в методах StartResultCache и AbortResultCache передаются ключи с поддоменом.
- В сложных случаях с несколькими поддоменами и языками рекомендуется реализовать кеш с учётом и того, и другого параметра, например,
md5($_SERVER['HTTP_HOST'].'_'.$LANGUAGE_ID)
.
Отказ от сегментации кеша по поддоменам ведёт к показу неверного контента и нарушению логики работы сайта с региональными настройками.
Настройка ЧПУ и SEO-шаблонов для поддоменов в административной панели
Для каждого городского поддомена необходимо задать индивидуальные правила ЧПУ. В разделе «Настройки» → «Настройки продукта» → «Поисковая оптимизация» выбирайте пункт «ЧПУ». Здесь создайте отдельный шаблон URL для поддомена, учитывая структуру пути, характерную для данного города.
Пример шаблона для поддомена города: #SITE_DIR#/catalog/#SECTION_CODE_PATH#/#ELEMENT_CODE#/
. Для корректной работы важно убедиться, что переменная SITE_DIR соответствует поддомену, назначенному в настройках сайта в Битриксе.
Для SEO-шаблонов в разделе «Настройки» → «Настройки продукта» → «Поисковая оптимизация» → «SEO» создайте шаблоны мета-тегов (title, description, keywords) с динамическими переменными, такими как #CITY_NAME# или #SECTION_NAME#. Это позволяет автоматически подставлять название города и другие параметры, адаптируя страницы под поддомен.
Если в системе несколько сайтов под разными поддоменами, обязательно для каждого из них задать собственные параметры SEO в разделе «Сайты» → «Настройки сайта» → «SEO», чтобы избежать дублирования контента и обеспечить уникальность заголовков и описаний.
Проверяйте, что в настройках компонента включена опция «Использовать ЧПУ» и прописан соответствующий шаблон. В случае сложных правил URL используйте файл urlrewrite.php, добавляя отдельные правила для каждого поддомена с указанием правильных префиксов.
После настройки рекомендуется провести тесты по индексации в Яндекс.Вебмастере и Google Search Console, чтобы убедиться в корректности распознавания URL и корректном отображении SEO-данных для каждого поддомена.
Вопрос-ответ:
Как настроить URLRewrite для поддоменов городов в Битрикс?
Для настройки URLRewrite поддоменов городов нужно создать правила в файле .htaccess или через модуль в Битрикс, которые будут определять поддомен и перенаправлять запросы на соответствующие разделы сайта. Например, для поддомена moscow.example.ru прописывается правило, которое направляет на каталог или компонент, отвечающий за Москву. Важно учитывать, что поддомены должны быть настроены на уровне DNS и веб-сервера, а в самом Битрикс — прописаны соответствующие правила обработки URL.
Можно ли использовать один и тот же шаблон сайта для всех городских поддоменов с помощью URLRewrite?
Да, можно. При правильной настройке URLRewrite можно направлять все поддомены на один и тот же шаблон, передавая параметр с названием города. Это позволяет использовать одну структуру сайта и только менять содержимое в зависимости от поддомена. Например, шаблон проверяет текущий поддомен и подгружает данные, соответствующие выбранному городу, что упрощает поддержку и обновление сайта.
Какие ошибки часто встречаются при настройке URLRewrite для поддоменов в Битрикс и как их избежать?
Часто возникают ошибки из-за неверных правил в .htaccess или отсутствия настроек DNS для поддоменов. Иногда неправильно прописываются регулярные выражения, из-за чего запросы не проходят на нужные страницы. Чтобы избежать проблем, стоит проверить корректность DNS, убедиться, что веб-сервер обрабатывает поддомены, и тщательно протестировать правила в .htaccess. Также важно убедиться, что параметры в URLRewrite соответствуют структуре сайта и компонентам в Битрикс.
Как проверить, что правила URLRewrite для городских поддоменов работают правильно?
Проверка начинается с тестирования перехода на поддомены через браузер. Если настройка выполнена верно, при обращении к поддомену, например, spb.example.ru, загрузится страница, соответствующая Санкт-Петербургу. Можно использовать инструменты разработчика в браузере для отслеживания редиректов и запросов к серверу. Также стоит проверить логи веб-сервера и ошибок Битрикс, чтобы убедиться, что нет сбоев в обработке URL и подгрузке контента.