Вызов ошибки 404 средствами php

Ошибка 404Я решил перенести большую часть файлов со старого сайта на новый. И у меня возник вопрос — «А не обвинит ли меня Yandex в использовании неуникальных статей?», т.к. у меня одни и те же материалы будут на разных страницах.

Я написал письмо в службу поддержки yandex, и мне пришло письмо, в котором сообщалось, что переживать не надо. Единственно, настоятельно желательно, чтобы я каким-то способом закрыл старые странички от индексирования (через robots.txt, вызов ошибки 404 или перенаправление) и удалил странички из базы по адресу http://webmaster.yandex.ru/delurl.xml. Удалять по указанному адресу желательно, чтобы быстрее прекратилась индексация страниц.

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

Мой сайт написан был на php, поэтому я очень быстро нашел команду для вызова ошибки 404. Она имеет вид:

header("HTTP/1.0 404 Not Found");
exit;

Казалось бы все просто, но нет же. Никак эти две команды не хотели работать. Тогда я почитал дополнительно материал и выяснил, что  header() должна вызываться до отправки любого другого вывода. Т.е. она должна быть исключительно самой первой при выводе, поэтому ее нельзя использовать внутри require_once().

Но как оказалось существуют три замечательные функции, которые позволяют решить эту проблему:

  • ob_start() — задает начало области, которую надо поместить в буфер, я поместил ее самой первой при выводе.

  • ob_end_flush() — окончание задания буфер и сразу вывод. Т.е. первые две функции задают область, которую сначала нужно вывести в буфер, а потом сразу вывести.
  • ob_end_clean() — очищает буфер, и следующая команда как бы выводится самой первой.

С использованием этих команд организация вызова ошибки 404 выглядит следующим образом:

  1. Самая первая команда — ob_start()
  2. Далее идет основное содержание, которое пока копируется в буфер.
  3. Проверка на предмет вызова ошибки 404. Например, проверка наличия определенного значения. Если после проверки имеются причины вызвать ошибку, то задается код:
    ob_end_clean() ;
    header("HTTP/1.0 404 Not Found");
    exit;

    Тем самым будет выдано сообщение об ошибке и осуществлен выход.

  4. Выводим содержимое буфера командой ob_end_flush(). Идея в том, что если была вызвана ошибка, то сюда не попадем. Если ошибки не было, то выводим буфер.

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

Поделиться:
  • Добавить ВКонтакте заметку об этой странице
  • Мой Мир
  • Facebook
  • Twitter
  • LiveJournal
  • FriendFeed
  • В закладки Google
  • Google Buzz
  • Яндекс.Закладки
  • StumbleUpon
  • Technorati
  • БобрДобр
  • Memori.ru
  • МоёМесто.ru

6 комментариев к “Вызов ошибки 404 средствами php”

  1. Заголовки должны отправляться до первой команды вывода в браузер. Обычно это echo() или print(). Замечу, что тот же var_dump() (я его часто использую для отладки), не влияет на заголовки, хотя и выводит текст на экран.

    Буферизация — это, конечно, хорошо. Но лично я использую немного другой метод. Весь контент, который нужно будет выводить, я собираю в переменную, а вывод ее значения всегда делаю самой последней командой. В итоге я могу на любом этапе работы скриптов совершенно свободно работать с заголовками (отдавать, заменять etc). Но это подходит, наверное, только для самописных с нуля сайтов.

    1. Очень плохой способ вы придумали…. т.к. одна единственная ошибка в коде приведет к то му что данные выводиться не будут, а понять в каком месте кода ошибка будет ой как не просто….. придется заново все разбивать……

      И вообще…. если что-то выводиться до header это неграмотность, неправильная архитектура кода, и естественно нерациональность полнейшая. Вначале проверить надо, а потом выводить что либо.
      _______________________________
      «А не обвинит ли меня Yandex в использовании неуникальных статей?», т.к. у меня одни и те же материалы будут на разных страницах.

      Я написал письмо в службу поддержки yandex, и мне пришло письмо, в котором сообщалось, что переживать не надо.
      ______________________________
      хахаха. ну это вообще детский сад какойто….
      есть же 301 редирект, директива Host в robots.txt, ………..
      404 нежелательно делать в этом случае… Т.к. наверняка уже есть с 10-к сайтов которые успешно скопировали Ваш контент, и получают бабки за рекламу.
      если статья была уникальная, то при 301 редиректе Вы сохраните уникальность, а при 404 ошибке, уникальность будет потеряна и вы замкнете 10к тех сайтов которые передрали у Вас контент.

  2. С переменной идея мне понятна. Спасибо за подсказанную идею. Ваш вариант мне нравится больше, чем мой.

  3. Видимо ZeroXor хотел сказать, что заголовки можно посылать в любом участке кода, главное чтоб до отправки заголовков не было экранирования;)

  4. Уверен, что не читает. Надо на прямые исправить при программировании.

Комментарии закрыты.