@fiter

Как отдать 404 ошибку в битриксе?

Есть инфоблок со списком поддоменов.
Если зайти на поддомен, которого нет в этом списке, должен отдаваться статус 404.

Нижеприведённый код работает на всём сайте, кроме главной страницы.
К примеру, a.vsesvetodiody.ru/dileram.html - правильно отдаёт 404, а просто a.vsesvetodiody.ru выдаёт пустую страницу, хотя скрипт точно доходит до создания файла 1111111111111111111.txt
В чём может быть проблема?

AddEventHandler("main", "OnEpilog", "handler404");
function handler404()
{
  
    global $USER;
    global $APPLICATION;
  
    $curDir = $APPLICATION->GetCurDir();
    $arDir = explode('/', $curDir);
    $curPage = $APPLICATION->GetCurPage();
    
    if (isset($_SERVER["REAL_FILE_PATH"]))
    {
        $arRequest = explode("/", $_SERVER["REDIRECT_URL"]);
        if  (
                (
                    ($_SERVER["REAL_FILE_PATH"] == "/index.php") 
                    && (count($arRequest) != 3)
                ) 
                || 
                (
                    (count($arRequest) == 3) 
                    && (strlen($arRequest[2]) > 0) 
                    && (substr($arRequest[2], -5, 5) != ".html")
                )
            )
        {
            define("ERROR_404", "Y");
        }
    }


    $poddomen=str_replace(".vsesvetodiody.ru","",$_SERVER["HTTP_HOST"]);
    $poddomen=str_replace("vsesvetodiody.ru","",$poddomen);
   
  
    if(defined('ERROR_404') && ERROR_404 == 'Y')
    {
    
        $template = 'main';
        $APPLICATION->RestartBuffer();
        $APPLICATION->SetPageProperty("title", "Ошибка 404");
        $APPLICATION->SetPageProperty("h1", "Error 404");
        $APPLICATION->SetTitle("Error 404");
        include_once($_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/urlrewrite.php');
        include $_SERVER['DOCUMENT_ROOT'].'/bitrix/templates/'.$template.'/header.php';
        include $_SERVER['DOCUMENT_ROOT'].'/include/404_text.php';
        include $_SERVER['DOCUMENT_ROOT'].'/bitrix/templates/'.$template.'/footer.php';
    
    } else if ($poddomen) {

        CModule::IncludeModule('iblock');
        $select = Array("NAME","ID","CODE");
        $arFilter = Array("IBLOCK_ID"=>2, "CODE" => $poddomen, "ACTIVE" => "Y");
        $res = CIBlockElement::GetList(Array("SORT"=>"ASC", "PROPERTY_PRIORITY"=>"ASC"), $arFilter, $select);
        $poddomen = $res->GetNext();  

        if(!$poddomen["ID"])  {

          file_put_contents('1111111111111111111.txt', 1); 

          $template = 'main';
          $APPLICATION->RestartBuffer();
          $APPLICATION->SetPageProperty("title", "Ошибка 404");
          $APPLICATION->SetPageProperty("h1", "Error 404");
          $APPLICATION->SetTitle("Error 404");
          include_once($_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/urlrewrite.php');
          include $_SERVER['DOCUMENT_ROOT'].'/bitrix/templates/'.$template.'/header.php';
          include $_SERVER['DOCUMENT_ROOT'].'/include/404_text.php';
          include $_SERVER['DOCUMENT_ROOT'].'/bitrix/templates/'.$template.'/footer.php';

        }

    }
  
}
  • Вопрос задан
  • 3053 просмотра
Пригласить эксперта
Ответы на вопрос 2
if (!defined("ERROR_404"))
	define("ERROR_404", "Y");

\CHTTP::setStatus("404 Not Found");

if ($APPLICATION->RestartWorkarea())
{
	require(\Bitrix\Main\Application::getDocumentRoot() . "/404.php");
	die();
}
Ответ написан
Комментировать
CHTTP::SetStatus("404 Not Found");
@define("ERROR_404","Y");
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы