Когда отправлять код состояния HTTP?

В настоящее время в моих сценариях PHP я перенаправляю пользователя на пользовательскую страницу ошибки 404, когда он/она пытается получить доступ к контенту, который не существует или не принадлежит этому пользователю. Вот так:

header('Location: http://www.mydomain.com/error/notfound/');
exit;

Я понимаю, что приведенный выше вызов header() по умолчанию отправляет код состояния перенаправления 302.

Однако я не понимаю, когда я должен отправить код состояния 404 not found. Прежде чем я перенаправлю пользователя? Или когда я отображаю страницу /error/notfound/?

Спасибо за вашу помощь!


person Justin Stayton    schedule 01.05.2009    source источник


Ответы (6)


Вы должны сделать что-то вроде этого:

header("HTTP/1.0 404 Not Found");
include 'error.php';
die();
person Pim Jager    schedule 01.05.2009
comment
Что произойдет, если браузер использует HTTP/1.1 для подключения? Заставляет ли php apache с mod_php отправлять ответ HTTP/1.1??? - person Christian; 08.02.2011

Вы вообще не выполняете 404 ошибки как перенаправление.

Что вы действительно хотите сделать, так это отправить заголовок состояния 404, а затем заменить текущий вывод телом страницы 404.

Есть разные способы сделать это, и это во многом зависит от того, как структурирован ваш сайт. Приложения MVC обычно передают это с переадресацией. Я видел другие системы, которые выдают исключение, а затем зарегистрированный обработчик исключений заботится об отображении страницы 404.

Во всяком случае, грубые шаги

  1. Определить недопустимое содержимое
  2. Вырваться из текущего исполнения
  3. Очистите любой вывод, если таковой имеется.
  4. Отправить заголовок статуса 404
  5. Отправить содержимое страницы 404
person Peter Bailey    schedule 01.05.2009
comment
+1 хорошо объяснил. Особенно за упоминание о том, что 404 ошибки не выполняются как перенаправление, я думаю, что это важный момент. - person David Z; 01.05.2009

Вы не можете использовать 404 и Location: вместе. Местоположение допустимо только для некоторых ответов (201 и 3xx)

Однако вы можете отправить пользовательскую HTML-страницу в качестве тела ответа 404.

person Peter Štibraný    schedule 01.05.2009

Из php.net:

Есть два вызова заголовков в особом случае. Первый — это заголовок, начинающийся со строки «HTTP/» (регистр не имеет значения), который будет использоваться для определения кода состояния HTTP для отправки. Например, если вы настроили Apache для использования скрипта PHP для обработки запросов на отсутствующие файлы (используя директиву ErrorDocument), вы можете убедиться, что ваш скрипт генерирует правильный код состояния.

<?php
header("HTTP/1.0 404 Not Found");
?>

http://us.php.net/manual/en/function.header.php

person James Socol    schedule 01.05.2009

Вы должны отправить код состояния HTTP 404. Браузеры и сканеры понимают это. Вы также можете включить более удобную страницу ошибки, объясняющую, что произошло, включая форму для поиска по вашему сайту, ссылки Soundex и т. д.

person jabley    schedule 01.05.2009

«Редирект» и «не найдено» — разные понятия.

Какой файл удалось найти?
http://www.mydomain.com/error/notfound/
или
http://www.mydomain.com/not_exist.html

Страница "http://www.mydomain.com/not_exist.html" должна иметь Заголовок 404 И содержимое «Страница не найдена».

Быстрое исправление может быть:

header("HTTP/1.0 404 Not Found");
readfile('http://www.mydomain.com/error/notfound/');
exit;

Но для этого требуется 2 запроса Apache, и это довольно неприятно.

person Bob Fanger    schedule 01.05.2009