Digs - Персональная территория

Авторский проект Артема Глазкова
? 
        Версия для печати (цвет)  

Использование материалов
Заметка #4
05 мая 2005

Обработка 404


    Наверняка все, кто просидел в Интернете не мало времени, сталкивались с этой ошибкой - "Отсутствующая страница". На некотором этапе сайта у меня возникло желание самому обрабатывать эту ошибку, чтобы при ее появлении пользователю было доступно меню, и он не спешил уйти с моего сайта.

    Если сайт стоит на сервере Apache, то у разработчика имеется возможность настраивать некоторые возможности сервера применительно к своему сайту. Для этого служит файл .htaccess. Это обычный текстовый файл, с одной особенностью - он должен быть записан в UNIX-формате — это означает, что перевод строки должен задаваться в нем одним символом (0x0A), а не двумя (0x0D 0x0A). Я пользуюсь встроенным редактором программы Far. Данный редактор позволяет по комбинации Shift-F2 сохранить файл в нужном формате. Действие файла распространяется на каталог, в который его положили, а также на все подкаталоги до момента, пока не появится еще один .htaccess.
    Перенаправление ошибки 404 происходит следующей командой.

ErrorDocument 404 /error.php


    Здесь error.php имя скрипта, который будет вызван при возникновении ошибки с данным кодом. Чтобы не разрушать высказывания заголовка предыдущей статьи у меня эта строчка выглядит так:

ErrorDocument 404 /index.php?sec=404


    При старте скрипта остается проверить значение переменной $sec и вывести соответствующее сообщение.
    И вот тут меня поджидал сюрприз. Допустим, пользователь вводит в адресной строке вот такую строчку:



    Как и следовало ожидать, происходит вызов index.php?sec=404. Но в адресной строке браузера остается введенная пользователем строка. В итоге получаем не очень приятную картину с относительными ссылками. Если ссылка из меню на блог записана как ?sec=blog, то при наведении на нее мышки получалась ссылка abc?sec=blog, вместо index.php?sec=blog.
    Решилось все достаточно просто. Нужно сделать обычный редирект на ту же самую страницу. При этом нужно сделать проверку, нужен ли такой переход. Для этого проверяем наличие и содержимое переменной $_SERVER['REDIRECT_URL']. Если значение этой переменной не равно /index.php, то делаем редирект. Последняя деталь: в какой-нибудь переменной сессии запоминаем этот самый abc, чтобы потом предъявить его пользователю. Код:

if (isset($_SERVER['REDIRECT_URL'])&&
    (
$_SERVER['REDIRECT_URL']!="/index.php")&&
    (
$_SERVER['REDIRECT_URL']!="/")) {
  
$_SESSION['lasterror'] = $_SERVER['REDIRECT_URL'];
  
header("Location: index.php?sec=404");
}

3 июня 2005

    Вот и обнаружился сегодня шикарный глюк данного скрипта. Спасибо пытливым людям, которые стараются нестандартно обратиться к страницам сайта.
    Описываю. Человек набирает в строке http://digspt.ru/images/ . В итоге, вызывается приведенный выше код, делает проверки и, удовлетворившись в них всех, запускает редирект. Но, запускает он его из текущего каталога, так как мы стоим в папке images. Т.е. запускается не /index.php, а /images/index.php. Естественно, там такого файла нет, поэтому происходит опять вызов обработчика 404-ой ошибки. Таким образом, мы получаем зацикливание.
    Исправляется это добавлением слеша:

  header("Location: /index.php?sec=404");


© 2005-16, Powered By Digs (Написать письмо, vk)