@Yudgin888

Как в init.php можно определить, что url вернет 404?

В init.php есть функция, в которой происходит обработка урла. Если урл был изменен, делается редирект 301 на измененный урл. Обработчик подключается так: AddEventHandler("main","OnProlog","redirect301");
Нужно в конце этой функции проверить на существование страницы, и потом делать редирект 301 или 404.
Как в битриксе можно проверить урл?
  • Вопрос задан
  • 646 просмотров
Решения вопроса 1
@Yudgin888 Автор вопроса
Как я это решил. Может кому пригодится.
AddEventHandler("main","OnProlog","checkUri");
function checkUri(){
    $GLOBALS["STATUS"] = 200;
    $uri = $_SERVER['REQUEST_URI'];
 //обработка урла
        if(strcmp($uri, $_SERVER['REQUEST_URI']) !== 0){
            $_SERVER['REQUEST_URI'] = $uri;
            $GLOBALS["STATUS"] = 301;
        }
    }
}

AddEventHandler('main', 'OnEpilog', 'сheck404Error', 1);
function сheck404Error() {
    if ((defined('ERROR_404')) && (ERROR_404 == 'Y') && ($_SERVER['REQUEST_URI'] != '/404.php') || preg_match('/[а-яА-Я\s]+/msi', $_SERVER['REQUEST_URI'])) {
        $GLOBALS["STATUS"] = 404;
    }
}

AddEventHandler("main","OnEpilog","redirects");
function redirects(){
    if($GLOBALS["STATUS"] === 301) {
        header("HTTP/1.1 301 Moved Permanently");
        header('Location: ' . $_SERVER['REQUEST_URI']);
        exit();
    } elseif($GLOBALS["STATUS"] === 404){
        global $APPLICATION;
        $APPLICATION->RestartBuffer();
        include $_SERVER['DOCUMENT_ROOT'] . '/bitrix/templates/'.SITE_TEMPLATE_ID.'/header.php';
        require ($_SERVER["DOCUMENT_ROOT"] . "/404.php");
        include $_SERVER['DOCUMENT_ROOT'] . '/bitrix/templates/'.SITE_TEMPLATE_ID.'/footer.php';
    }
}
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@eternalfire
Привет!
Если страница не существует, по умолчанию и так ведь сработает редирект на 404.php

Но если в лоб, то делать запрос к этому url и смотреть заголовки
$file = 'http://www.domain.com/somefile.jpg';
$file_headers = @get_headers($file);
if(!$file_headers || $file_headers[0] == 'HTTP/1.1 404 Not Found') {
    $exists = false;
} else {
    $exists = true;
}


или curl вариант
function url_exists($url) {
    if (!$fp = curl_init($url)) return false;
    return true;
}


https://stackoverflow.com/questions/2280394/how-ca...
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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