Страница ошибки PHP 404 не отображает содержимое

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

Вот очень простой скрипт, который я использую:

<?php
  header('HTTP/1.1 404 Not Found');
  header('Status: 404 Not Found');
  var_dump(headers_list());
?>

На моей машине-разработчике вывод (отображаемый в браузере)

array(2) { [0]=>  string(23) "X-Powered-By: PHP/5.2.6" [1]=>  string(21) "Status: 404 Not Found" }

На моем хосте нет выхода. Кажется, я не могу сгенерировать ничего, кроме пустой страницы, независимо от того, какой контент повторяется PHP или включается ниже как обычный HTML, хотя обработка PHP, например. ведение журнала, запись в базу данных и т. д. продолжаются в обычном режиме.

Может кто подскажет в чем может быть проблема или как ее решить?


person Loftx    schedule 13.04.2009    source источник
comment
Вы получаете тот же результат в Firefox И IE? Если нет, то я знаю ответ   -  person OneNerd    schedule 13.04.2009


Ответы (6)


Если PHP настроен на вашем хосте для запуска через CGI, может быть невозможно генерировать страницы с ошибкой 404 в IIS (за исключением лжи и возврата 200 OK, что является Плохой вещью). Конечно, мне не удалось убедить IIS 4-6.0 пропускать мои ошибки CGI 404 в браузеры.

Как правило, вы все равно не хотите, чтобы PHP запускал CGI, есть и другие связанные с этим проблемы, а также медленный. В IIS предпочтение следует отдавать расширению PHP ISAPI (хотя, поскольку я его не пробовал, я не могу подтвердить, что оно решает эту конкретную проблему).

person bobince    schedule 13.04.2009

«пустая страница» пахнет как error_reporting(0), скрывающая сообщения об ошибках, которые вы получите. Возможно, перед вашими заголовками есть какой-то вывод, и это вызывает ошибку. Проверь это.

person zalew    schedule 13.04.2009
comment
+1, звучит глупо, но видел это несколько раз и должен быть проверен в первую очередь - person Cruachan; 15.04.2009

Что, если вы поместите текст после тегов PHP?

Кроме того, убедитесь, что ваш скрипт не выдает ошибку на вашем хосте, будь то проверка журналов ошибок apache, запуск php -l в вашем скрипте или включение error_reporting и display_errors.

person Matt    schedule 13.04.2009
comment
Как вы предложили, я изменил код на: ‹?php error_reporting(E_ALL); ini_set('display_errors', '1'); заголовок('HTTP/1.1 404 не найден'); header('Статус: 404 Not Found'); var_dump(headers_list()); ?›CONTENT На моем хосте вывод по-прежнему пуст. - person Loftx; 13.04.2009
comment
Извините, это не слишком хорошо отобразилось. Также мой хост запустил скрипт в командной строке сервера для меня с выводом: массив (0) {} и без ошибок. Хотя я предполагаю, что header() предназначен специально для случаев, когда php вызывается через веб-сервер. - person Loftx; 13.04.2009
comment
Попробуйте комментировать по одной строке за раз, пока не увидите вывод CONTENT. - person Matt; 13.04.2009

У меня такая же проблема с PHP 5.2.6 в Linux. Я обнаружил, что первые 8109 байт не печатаются веб-сервером.

IE6 игнорирует пользовательские страницы ошибок длиной ‹ 512 байт. Это может быть объяснением этой проблемы, но, вероятно, вы все равно тестировали более чем в одном браузере.

person Community    schedule 20.08.2009

Убедитесь, что ваш хост позволяет изменять заголовки на лету с помощью PHP. Мой хост не позволяет мне установить заголовок 404 через PHP, хотя другие заголовки (301, тип содержимого) в порядке.

person DisgruntledGoat    schedule 13.04.2009

Мой совет — не устанавливать заголовок HTTP/1.1 404 самостоятельно и позволить веб-серверу сделать это за вас.

Традиционно это делается с помощью заголовка Status, который веб-сервер должен принять и преобразовать в заголовок HTTP/1.0 или 1.1 404 Not Found.

(Примечание: заголовок Status не является настоящим заголовком HTTP и используется исключительно для передачи информации из приложения на сам сервер.)

person Powerlord    schedule 13.04.2009