В одном из проектов столкнулся с проблемой:
Описание проблемы
Проект: интернет магазин на Bitrix на основе шаблона Сотбит: Оригами. Так как проект - интернет магазин: то соответственно в нём используются региональные поддомены. Поддомены реализованы на входящем в шаблон решении Сотбит: Мультирегиональность (sotbit.regions).
Чтобы не добавлять каждый поддомен, на хостинге основному домену добавлена подзона вида *.domain.ru - которая делает доступным любой введённый поддомен 3 уровня.
Может плохо разбирался в настройках Сотбит: Мультирегиональность (sotbit.regions), но нигде не нашёл опцию, отвечающую за обработку не добавленных поддоменов на сайте. Т.е для любого поддомена вида абракадабра.domain.ru открывался Интернет-магазин, хотя по логике должна была отдаваться страница "404 ошибки".
Что решил сделать?
Написать обработчик события OnEpilog в котором сравнивал поддомен из переменно $_SERVER['HTTP_HOST'] со списком поддоменов добавленных в модуле Сотбит: Мультирегиональность (sotbit.regions).
Реализация
В файл init.php необходимо добавить следующий код:
AddEventHandler("main", "OnEpilog", "handler404");
//Обработка несуществующих поддоменов
function handler404()
{
$httpHost = str_replace('www.', '', $_SERVER['HTTP_HOST']);
$urlArray = explode('.', $httpHost);
if (count($urlArray) > 2 && !empty($urlArray[0])):
$connection = Bitrix\Main\Application::getConnection('default');
$sqlHelper = $connection->getSqlHelper();
$sql = "SELECT CODE FROM `sotbit_regions`";
$rsResult = $connection->query($sql);
while ($arDomain = $rsResult->fetch()):
$withOutHTTP = str_replace(['https://', 'http://'], '', $arDomain['CODE']);
$tmpDomainArray = explode('.', $withOutHTTP);
if (count($tmpDomainArray) > 2){
$domainList[$tmpDomainArray[0]] = $withOutHTTP;
}
endwhile;
if (!isset($domainList[$urlArray[0]]) && empty($domainList[[0]])):
define("ERROR_404", "Y");
show404error();
endif;
endif;
}
// Редирект на 404 страницу
function show404error(){
if (defined('ERROR_404') && ERROR_404 == 'Y') {
LocalRedirect("https://your-domain.ru/404.php", "404 Not Found");
}
}
В функции show404error() замените your-domain.ru на адрес вашего сайта.
файл init.php находится по адресу /bitrix/php_interface/ или /local/php_interface/. Если файл отсутствует, тогда его нужно создать в одной их этих папок.
Это решение работает для модуля Сотбит: Мультирегиональность (sotbit.regions) так как список поддоменов получает через запрос MYSQL запрос к таблице в которой хранятся добавленные поддомен.
Если у Вас хранение поддоменов реализовано на Инфоблоков, Вы можете легко переписать код на получение данных из инфоблока поддоменов при помощи API Bitrix метода CIBlockElement::GetList().