Как разрешить 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. Но я не хочу сказать Apache 500 Internal Server Error. Может быть, на .htaccess или около того.

7 голосов | спросил hek2mgl 5 AM000000110000005231 2010, 11:43:52

3 ответа


0

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

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

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

ответил Álvaro González 5 PM000000120000000931 2010, 12:02:09
0

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

ответил Salman A 8 Jpm1000000pmTue, 08 Jan 2013 14:01:39 +040013 2013, 14:01:39
0

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

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

  

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

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

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

ответил Your Common Sense 8 Jpm1000000pmTue, 08 Jan 2013 14:09:26 +040013 2013, 14:09:26

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132