Приветствую читателей SEOBID.NET! Недавно столкнулся с проблемой создания страницы ошибки 404. Точнее, с созданием самой страницы как раз проблем никаких не было, а вот, настраивая эту страницу, я совершенно случайно обнаружил, что есть лишний запрос. Лишний – это сугубо мое мнение и, может быть, кто-то так не считает.

Объясняю проблему. Существует распространенное мнение, что правильно будет отдавать сначала 302 код, а только потом код 404 при помощи команды header(«location:/404») в .htaccess, когда отображается страница 404. Конкретно код 302 — это значит, что запрошенный документ временно перемещен и доступен по адресу, который идет следом за ним в заголовке location. Но это по стандарту.

А стандарты в web – дело тоже расплывчатое. Когда, например, я проверил в Яндексе ответ на ошибку 404 (запрос несуществующей страницы http://yandex.ru/vvfgrtyhj), то увидел вот такую картинку, на которой места для 302 ответа не было, а сразу отдавался код 404.

Яндекс

Вот эта ситуация меня и заставила задуматься, почему у меня формируется другой ответ. Кстати, на WordPress такой ситуации не будет, так как там в .htaccess не приписан такой код — header(«location:/404»). Но я делал самописный сайт на скрипте, и у него в .htaccess была эта команда, что считается вообще-то хорошим тоном.

Поэтому я просто проследил при помощи плагина Firebug коды ответа, и решил, что лишний запрос мне ни к чему. Должен сразу выдаваться код 404. Если вы будете использовать плагин WebDeveloper, то но не покажет вам промежуточные ответы, и вы, соответственно, не увидите, где была допущена ошибка.

Для SEO этот момент очень важен – так можно оставить на сайте много промежуточных запросов, которые вы просто не заметите, но они будут выполняться, и будут тормозить сайт. Плагин Firebug показывает список всех ответов сервера, и на сайте я увидел следующую картинку:

Редирект

Сервер выдавал 302 редирект, и только потом переводил запрос на страницу 404.html. Обычно в .htaccess страница ошибки прописывается вот так: ErrorDocument 404 /404.php или ErrorDocument 404 /404. html – неважно.

Если хостинг, которым вы пользуетесь, работает на Apache, (почти все современные хостинги используют Apache) то можно редактировать страницы 404 через файл .htaccess. В этом файле можно прописать специальную директиву ErrorDocument, которая позволит или показать свой текст при ошибке 404, или указать адрес HTML страницы, которую вы создадите для 404 ошибки. Вот эти команды:

 ErrorDocument 404 "Page not found or other text."
ErrorDocument 404 http://ваш_сайт/404.html 

Но это не очень распространенное решение, которое используют немногие. Поэтому, если делать так, как советуют многие:

header('HTTP/1.0 404 Not Found');
header("location:/404");

то header(«location… — отдает код 302 (если раньше не устанавливалась команда 201 или 3xx). Здесь совершенно неважно, куда отправляет редирект, так как он в любом случае лишний. Получается, что при помощи этой команды (header location) правильно сделать 404 код невозможно. Прошу понять меня правильно J – сделать 404 можно, и работать это будет, но будет работать неправильно, с одним лишним запросом. Поэтому в итоге я решил использовать в коде такую конструкцию:

 header($_SERVER['SERVER_PROTOCOL'] . ' 404 Not Found');
include_once("404.php");
exit;

То есть, мы просто практически насильно (команда include_once) вставляем страницу 404.php. Зато никаких промежуточных кодов, и с таким построением все работает, как следует:

Правильный ответ

На сегодня все – статья получилась маленькая, но полезная – сколько лишних запросов уберется вот таким решением. До встречи на страницах следующей публикации!