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

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

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

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

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

Проект: интернет магазин на 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
#bitrix:news, #сортировка, #фильтрация, #bitrix:catalog, #catalog.section, #news.list
16 дек 2020
#Хлебные крошки, #1С Битрикс, #Bitrix CMS, #bitrix:breadcrumbs, #component_epilog, #кэширование
1 окт 2018
#bitrix, #свойства элементов, #обработчик событий, #OnBeforeIBlockElementUpdate, #OnIBlockElementSetPropertyValues
21 июл 2020
#Bitrix CMS, #breadcrumb, #bitrix:breadcrumbs, #хлебные крошки, #настройка
13 фев 2019
#ресайз изображений, #1С Битрикс, #Bitrix CMS
3 мар 2019
#bitrix, #robots.txt, #sitemap.xml, #поддомены, #мультисайтовость
16 окт 2018
#bitrix, #bitrix:catalog.section, #скидки, #товары со скидкой, #страница скидок, #страница со скидками
4 окт 2018
#bitrix, #пользовательские свойства, #тип свойств, #привязка к элементам
27 ноя 2019