Собственные страницы ошибок (400, 403, 404, 500)

10:39 15.06.2017
На одном из своих сайт я делал себе страницы ошибок 400, 403, 404, 500. Хочу рассказать, как я это сделал. У меня языковые переменные ошибок находятся в отдельном файле:
<?php 
/*
    RU - Русский язык
    Файл error.php
*/

if (empty($lang) or !is_array($lang)) # Проверка на существование переменной $lang и является ли она массивом
{
    $lang = array(); # Если переменная не существует или это не массив, то создается массив
}

$lang = array_merge($lang, array( # Соединяет массив с уже созданным массивом
    'error_400' => 'Ошибка 400 (Bad Request)',
    'error_403' => 'Ошибка 403',
    'error_404' => 'Ошибка 404 (Page Not Found)',
    'error_500' => 'Ошибка 500 (Internal Server Error)',
    
    'error_400_info' => '<div class="error">Ошибка 400. Неверный запрос (Bad Request).</div>',
    'error_403_info' => '<div class="error">Ошибка 403. Нет прав на просмотр контента или на просмотр страницы.</div>',
    'error_404_info' => '<div class="error">Ошибка 404. Страница не найдена (Page Not Found).</div>',
    'error_500_info' => '<div class="error">Ошибка 500. Внутренняя ошибка сервера (Internal Server Error).</div>'
));

Файл, который отвечает за вывод страниц ошибок:
<?php
/*
    Страницы ошибок
    Файл error.php
*/

include('lang/ru/error.php'); # Подключение языкового файла

if (isset($_GET['mode']))
{
    # Ошибка 400
    if ($_GET['mode'] == '400')
    {
        $title = $lang['error_400'] . ' • ' . $lang['site_name'];
        $info  = $lang['error_400_info'];
    }
    # Ошибка 403
    if ($_GET['mode'] == '403')
    {
        $title = $lang['error_403'] . ' • ' . $lang['site_name'];
        $info  = $lang['error_403_info'];
    }
    # Ошибка 404
    if ($_GET['mode'] == '404')
    {
        $title = $lang['error_404'] . ' • ' . $lang['site_name'];
        $info  = $lang['error_404_info'];
    }
    # Ошибка 500
    if ($_GET['mode'] == '500')
    {
        $title = $lang['error_500'] . ' • ' . $lang['site_name'];
        $info  = $lang['error_500_info'];
    }
    
    template('info');     # Подключение шаблона
}
else 
{
    $location = (isset($_SERVER['HTTP_REFERER'])) ? (basename($_SERVER['HTTP_REFERER'])) : 'index' . PHP;
    header('Location: ' . $location, true, 301);
    exit;
}

Переменная $lang['site_name'] находится у меня в другом языковом файле (тоже массив $lang), содержит она в себе название сайта.

Ну конечно вставил в .htaccess следующие строки:
<IfModule mod_rewrite.c>
    RewriteEngine On

    # Error Page
    ErrorDocument 400 http://site/error.php?mode=400
    ErrorDocument 403 http://site/error.php?mode=403
    ErrorDocument 404 http://site/error.php?mode=404
    ErrorDocument 500 http://site/error.php?mode=500    
</IfModule>

Я прописываю абсолютный адрес страницы ошибок, так как используя не полный адрес страницы:
    ErrorDocument 404 /error.php?mode=404

перейдя на несуществующею страницу (пример): http://site/dir1/dir2/dir3/file.php, могут не подгрузиться стили сайта, JS и картинки, в итоги страница будет выглядеть криво, а все ссылки на этой страницы будут иметь адрес такого вида (например на главную): http://site/dir1/dir2/dir3/index.php, что совершенно не правильно.

Ну, вот пока все. Надеюсь информация была Вам полезной.
Спасибо за внимание.