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

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

29 мая 2021
Дмитрий М.
2559
404 ошибка для несуществующих поддоменов при динамическом формировании поддоменов

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

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

Проект: интернет магазин на 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
    #bitrix, #свойства элементов, #обработчик событий, #OnBeforeIBlockElementUpdate, #OnIBlockElementSetPropertyValues
    21 июл 2020
    #Хлебные крошки, #1С Битрикс, #Bitrix CMS, #bitrix:breadcrumbs, #component_epilog, #кэширование
    1 окт 2018
    #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