/ 404 ошибка для несуществующих поддоменов при динамическом формировании поддоменов

404 ошибка для несуществующих поддоменов при динамическом формировании поддоменов

29 Май 2021
Дмитрий М.
48

В одном из проектов столкнулся с проблемой:

Описание проблемы

Проект: интернет магазин на 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().

Статья была полезна? Поблагодарите автора.

Самые читаемые
#1С Битрикс, #Bitrix CMS, #.htaccess, #настройка редиректов
4 Авг 2019
#Хлебные крошки, #1С Битрикс, #Bitrix CMS, #bitrix:breadcrumbs, #component_epilog, #кэширование
1 Окт 2018
#ресайз изображений, #1С Битрикс, #Bitrix CMS
3 Мар 2019
#bitrix, #robots.txt, #sitemap.xml, #поддомены, #мультисайтовость
16 Окт 2018
#bitrix, #bitrix:catalog.section, #скидки, #товары со скидкой, #страница скидок, #страница со скидками
4 Окт 2018
#Bitrix CMS, #breadcrumb, #bitrix:breadcrumbs, #хлебные крошки, #настройка
13 Фев 2019
#bitrix, #пользовательские свойства, #тип свойств, #привязка к элементам
27 Ноя 2019
#bitrix, #свойства элементов, #обработчик событий, #OnBeforeIBlockElementUpdate, #OnIBlockElementSetPropertyValues
21 Июл 2020