Как разрешить Apache отправлять 500 в случае ошибки PHP? - PullRequest
7 голосов
/ 05 августа 2010

Я разрабатываю приложение PHP, которое использует HTTP-коды ответов для связи, а также тела ответов. Так что это типичный сценарий в коде PHP:

try {
    doSomething();
}
catch (Exception $e) {
    header('HTTP/1.1 500 Internal Server Error');
}

... и типичный код в клиентах выглядит так:

switch(responseCode) {
     case 200 :
         // all fine
         // ....
     case 500 :
         // trouble!
 } 

Это круто, если каждая ошибка хорошо фиксируется в PHP-коде.

Проблема: если по какой-либо причине в php-коде возникает необнаруженная ошибка или неисправимая ошибка, такая как синтаксические ошибки , Apache отправит 200 OK. Но я не хочу сказать Apache 500 Internal Server Error. Может быть, за .htaccess или около того.

Ответы [ 3 ]

2 голосов
/ 08 января 2013

Заголовки ответа не отправляются, пока PHP не отобразит первый байт тела ответа.Вы можете изменить заголовки (и код состояния) в то же время.Имея это в виду, вот решение:

Настройте ваш скрипт на отправку 500 кода ответа в начале скрипта и 200 в конце.Вот пример:

header($_SERVER['SERVER_PROTOCOL'] . ' 500 Internal Server Error');

if (rand(0, 1) == 1) {
    die("Script terminated prematurely");
}

header($_SERVER['SERVER_PROTOCOL'] . ' 200 OK');
echo "Success";

Просто убедитесь, что код ответа 200 установлен только в одном месте вашего кода.

Примечание: вы можете использовать http_response_code (PHP> = 5,4) вместо header.

2 голосов
/ 08 января 2013

В настоящее время это больше не проблема - с тех пор как 5.3 PHP научился наконец отправлять 503 при ошибке, а не 200

О, кажется, это было 5.2.4 :

Изменен обработчик ошибок для отправки HTTP 500 вместо пустой страницы об ошибках PHP.

Вам нужно установить display_errors = off, чтобы он работал

У меня на Windows работает точно Apache 2.4 с PHP 5.4.5

2 голосов
/ 05 августа 2010

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

Для обработки перехватываемых ошибок можно использовать auto_append_file и auto_prepend_file директивы для размещения кода кода обработки ошибок.

Неподнимаемые ошибки - это другая проблема.Если PHP работает как Fast CGI , он автоматически сгенерирует для вас 500 кодов состояния.Тем не менее, вы, вероятно, используете PHP через какой-то другой SAPI (например, модуль Apache).Понятия не имею об этом, извините.(Я сообщу, если найду что-нибудь.)

...