Когда отправлять код статуса HTTP? - PullRequest
3 голосов
/ 01 мая 2009

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

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

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

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

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

Ответы [ 6 ]

12 голосов
/ 01 мая 2009

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

header("HTTP/1.0 404 Not Found");
include 'error.php';
die();
9 голосов
/ 01 мая 2009

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

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

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

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

  1. Определить содержание недействительным
  2. Выход из текущего исполнения
  3. Очистить все выходные данные, если они есть.
  4. Отправить заголовок статуса 404
  5. Отправьте содержимое страницы 404
1 голос
/ 01 мая 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

1 голос
/ 01 мая 2009

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

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

0 голосов
/ 01 мая 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, и это довольно неприятно.

0 голосов
/ 01 мая 2009

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

...