Как позволить Apache отправлять 500 в случае ошибки PHP?

Я разрабатываю приложение 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. Но я не буду говорить об ошибке 500 Internal Server Error. Может быть, за .htaccess или около того.

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

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

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

Заголовки ответов не отправляются до тех пор, пока 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 установлен только в одном месте вашего кода.

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

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

Err, похоже, это было 5.2.4 :

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

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

У меня точное поведение на моих окнах Apache 2.4 с PHP 5.4.5