Обработка ошибок веб-сервера Apache

Представленный здесь скрипт был написан мной и реально работает на http://www.fondrostov.ru
Он предназначен для документирования ошибок веб-сервера типа всем знакомой "Error 404 Document not found" У меня он обрабатывает всего 4 ошибки: 401, 403, 404 и 500.
Ограничения для применения данного скрипта:

  • Наличие Unix-based хостинга, поскольку здесь используются функции .htaccess
  • Разрешенная у провайдера в настройках Apache возможность изменять значения (умолчания) использованием .htaccess
  • Поддержка РНР
  • Зачем нужен этот скрипт

    1. Вы хотите знать, когда и кто вызвал на Вашем сайте ошибки.
    2. Вы хотите сэкономить время и нервы на тестировании сайта, и оставить этот неблагодарный труд самим пользователям. Вам останется лишь заглянуть в лог-файл и исправить указанные ошибки.
    3. Вы хотите, чтобы вместо стандартного окошка с сообщением об ошибке появлялось ваше собственное, (можно даже с Вашим портретом :-)))
    4. Любые другие причины.

    Как именно заставить Apache вызывать наш скрипт

    Для начала надо создать файл .htaccess с примерно таким содержимым:
    ErrorDocument 401 /errors/401.php
    ErrorDocument 403 /errors/403.php
    ErrorDocument 404 /errors/404.php
    ErrorDocument 500 /errors/500.php
    
    и поместить его в корневую директорию ($DOCUMENT_ROOT) вашего хоста. Таким образом мы говорим веб-серверу, что при возникновении ошибки с указанным номером исполняется соответствующий скрипт. Далее пишем сам обработчик ошибок. Я приведу только один, хотя всего их 4. Они различаются только текстом сообщения об ошибке и именем лог-файла.
    /errors/401.php - путь от корня сайта до скрипта обработки ошибок.

    Сам скрипт

    404.php
    <HTML>
    <HEAD><TITLE>Error 404: Requested document not found</TITLE>
    <meta http-equiv="Content-Type" charset=windows-1251">
    Не забудьте явно указать кодировку, иначе клиент скорее всего получит бурду вместо русского текста.
    </HEAD>
    <BODY>
    <? $er_time=date("H:i:s d M Y");
    Определяем формат вывода даты и времени.
       $U=$HTTP_USER_AGENT;
    Собираем информацию о том, откуда пришел клиент, какой у него браузер, IP и обращение к какой странице вызвало ошибку.
       $H=$HTTP_REFERER;
       $R=$REMOTE_ADDR; 
       $W=$REQUEST_URI;
    if ($W=="")Если строка пустая, то вместо нее будет отображаться ---------, так дагляднее.
       $W="---------";
    if ($H=="")
       $H="---------";
       $logname="logs/fr_error404.log"; Определяем имя и расположение лог-файла
       $fd2=fopen($logname,'a+'); Открываем лог-файл по дискриптору $fd2
    fwrite($fd2,"<tr><td>$er_time </td><td>$R </td><td>$H </td><td>$W </td><td>$U </td></tr>\n");
     Записываем строку в виде ячеек таблицы и полученными значениями переменных
    fclose($fd2);
    не забываем закрыть лог
    ?>
    Далее идет текст, который отображается при показе страницы
    <h3><center>
    <? echo "$er_time"; печатаем время
    ?>
    
     Произошла ошибка.<br> 
    Запрашиваемый Вами документ
    "<? echo "$W";
    ?>" на сервере не найден.
    Администратор сайта будет проинформирован и примет меры по устранению возникшей ошибки. <br><br> <? echo "$er_time"; ?> an error has caused.<br>
    Англоязычный текст /признак хорошего тона или жест робкой надежды?/ Requested document "<? echo $W ; ?>" not found. Error code: 404. <br> Server administrator will be informed and will take measures to resolve this error. <br><br> <? include "sign.inc" ?> Подключаем файл с подписью и координатами администратора :) </center></h3> </body></html>
    Вот так!
    Таких файлов клепаем 4 штуки. Теперь неплохо бы систематизировать информацию, т.е. пора показать лог-файлы. Делаем это следующим образом: в навигации сайта добавляем пункт типа "Вход для Администратора" и ссылаемся на файл, например admin.php.

    Анализируй это

    admin.php
    <HTML><HEAD><TITLE></TITLE>
    <meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
    </HEAD>
    <BODY>
    <? $er_time=date("H:i:s d M Y"); 
    ?>
    <h3><center>
    Список ошибок, произошедших до  на сайте http://www.fondrostov.ru/
    <font size=-2>Версия 0.2.1 от 16 февраля 2003 года</font> </center> <br><br><br> Ошибка 401: Необходима авторизация<br> <table> <tr><td>Время_и_дата</td><td>IP_клиента</td> <td>Откуда пришел клиент</td><td>Запрошенная_клиентом_страница</td><td>Браузер_клиента</td></tr></b> <? include "logs/fr_error401.log" ?>
    Подключаем лог-файл </table><br><br> Ошибка 403: Доступ запрещен
    <table> <tr><td>Время_и_дата</td><td>IP_клиента</td> <td>Откуда пришел клиент</td><td>Запрошенная_клиентом_страница</td><td>Браузер_клиента</td></tr></b> <? include "logs/fr_error403.log" ?> </table><br><br> Ошибка 404: Запрашиваемый документ не найден
    <table> <tr><td>Время_и_дата</td><td>IP_клиента</td> <td>Откуда пришел клиент</td><td>Запрошенная_клиентом_страница</td><td>Браузер_клиента</td></tr></b> <? include "logs/fr_error404.log" ?> </table><br><br> Ошибка 500: Внутренняя ошибка сервера
    <table> <tr><td>Время_и_дата</td><td>IP_клиента</td> <td>Откуда пришел клиент</td><td>Запрошенная_клиентом_страница</td><td>Браузер_клиента</td></tr></b> <? include "logs/fr_error500.log" ?> </table> <br><br> <? include "sign.inc" ?>
    Информация для поклонников :-))) </h3> </body></html>
    Я думаю код файла, который мы с вами назвали admin.php в особых комментариях не нуждается. Но это еще не все. В принципе, остальным посетителям сайта нет необходимости видеть страницу со списком ошибок. Средствами того же .htaccess запретим просмотр папки с лог-файлами
    Options -Indexes
    
    положив его в папку с логами, и запаролим доступ к admin.php.
    Файл .htpasswd создается утилитой, которая идет в комплекте с Apache.
    
    AuthName "For Administrator Only" Текст, который будет отображаться на окошке авторизации
    AuthType Basic
    AuthUserFile /var/www/html/.htpasswd Абсолютный путь до файла .htpasswd
    require valid-user
    
    
    а этот файл положим в каталог с admin.php. да, и незабудте поставить права на запись в папку с логами rw-rw-rw, а *.php rwx-x-x
    Теперь скрипт готов к труду и обороне.

    Побочные эффекты:

    Если не создавать в корне сайта файл robots.txt, а я не вижу в этом объективной необходимости для большинства Интернет-проектов, то каждая индексация страниц вашего сайта будет обозначаться в логе как ошибка 404 документа robots.txt. А в колонке "Браузер клиента" отобразится название поисковика. Весьма полезная фенька.
    Я прекрасно понимаю, что код неоптимизирован, можно было сделать гораздо проще, можно добавить еще всяких фичей и т.д. Пожалуйста - действуйте, изменяйте, добавляйте. Готов к аргументированной критике. Все будет приятнее, что не зря провел столько часов перед монитором.

    С уважением Mikle Heavy AfghanServer 8/04/2003


    Hosted by uCoz