Как вернуть код HTTP 500 при любой ошибке, независимо от того, что

Я пишу скрипт аутентификации в PHP, который вызывается как API, который должен возвращать 200 only in the case that it approves the request, and 403 (Forbidden) or 500` в противном случае.

Проблема, с которой я столкнулся, заключается в том, что php возвращает 200 в случае ошибок, вызывая ошибку вместо html. Как я могу абсолютно уверен, что php вернет код HTTP 500 если я явно не верну сам HTTP 200 или HTTP 403 ? Другими словами, я хочу превратить все условия предупреждения или ошибки в 500 с без исключений, так что случай по умолчанию отклоняет запрос аутентификации, а исключение утверждает его с кодом 200 .

Я set_error_handler() с set_error_handler() и error_reporting() , но пока не повезло. Например, если код выводит что-то до отправки кода ответа HTTP, PHP, естественно, сообщает, что вы не можете изменять информацию заголовка после вывода чего-либо. Тем не менее, это сообщается PHP как код ответа 200 с html, объясняющим проблему. Мне нужно, чтобы даже такие вещи превращались в код 500 .

Возможно ли это в PHP? Или мне нужно сделать это на более высоком уровне, например, используя mod_rewrite ? Если это так, любая идея, как я это настрою?

Просто отправьте код состояния в качестве header() ответа header() :

 header('HTTP/1.1 500 Internal Server Error'); 

Помните, что при отправке этого не должно быть никакого выхода. Это означает отсутствие echo вызовов и отсутствие HTML или пробелов.

Я проверил документы PHP для header () , и это проще, чем я это делал, – если второй параметр равен true, он заменит аналогичный заголовок. значение по умолчанию – true. Поэтому правильное поведение – это заголовок ('HTTP/1.1 403 Forbidden'); , затем выполните логику аутентификации, затем, если он аутентифицируется, выполните заголовок ('HTTP/1.1 200 OK') . Он заменит ответ 403 и будет гарантировать, что 403 является значением по умолчанию.

На странице php для set_error_handler () вы можете найти комментарий smp в ncoastsoft dot com, опубликованный в 08-Sep-2003 10:28, который показывает, как даже улавливать фатальные ошибки (которые вы обычно не можете уловить с помощью специального обработчика ошибок. Я изменил код для вас:

 error_reporting(E_ALL); ini_set('display_errors', 'on'); function fatal_error_handler($buffer) { header('HTTP/1.1 500 Internal Server Error'); exit(0); } function handle_error ($errno, $errstr, $errfile, $errline){ header('HTTP/1.1 500 Internal Server Error'); exit(0); } ob_start("fatal_error_handler"); set_error_handler("handle_error"); //would normally cause a fatal error, but instead our output handler will be called allowing us to handle the error. somefunction(); ob_end_flush(); 

В этом случае можно обнаружить фатальную ошибку несуществующей функции. Он возвращает 500 и останавливает выполнение остальной части скрипта.

поскольку PHP 5.4.0 существует специальная функция для http_response_code() то есть:

 <?php http_response_code(404); ?> 

см. http://www.php.net/manual/en/function.http-response-code.php

 header($_SERVER['SERVER_PROTOCOL'] . ' 403 Forbidden'); 

Вы не должны использовать 500, что указывает на внутреннюю ошибку сервера.

Этот (и другие заголовки) следует отправлять перед любым выходом, кроме случаев, когда включена буферизация вывода.

Используйте буферизацию вывода, чтобы вы могли изменять заголовки после записи в тело страницы. Вы можете установить это в ini-файле, а не обновлять каждый скрипт.

(Обратите внимание, что вызов header () все равно не будет выполнен, если вы явно очистите выходной буфер)

C.

Любопытно, если вы когда-нибудь выяснили, как заставить PHP возвращать 500 на ошибки Parse … У меня такая же точная потребность … API отправляет в наше приложение и ожидает 200, только если все было обработано правильно …

В случае ошибки Parse PHP возвращает ошибку 200, и я использовал обе эти функции:

register_shutdown_function () set_error_handler ()

и они не попадают, когда в коде происходит ошибка «синтаксис / синтаксис» …

Итак, это низкоуровневая PHP-функция, которая должна быть установлена ​​в PHP.INI или где-то … Я использую PHP 5.3.10 …