Как вернуть код HTTP 500 при любой ошибке, независимо от того, что
Я пишу аутентификацию script в 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
s, без исключений, так что случай по умолчанию отклоняет запрос аутентификации, а исключение утверждает его с кодом 200
.
Я поиграл с set_error_handler()
и error_reporting()
, но пока не повезло. Например, если код выводит что-то до отправки кода ответа HTTP, PHP, естественно, сообщает, что вы не можете изменять информацию заголовка после вывода чего-либо. Тем не менее, это сообщается PHP как код ответа 200
с html, объясняющим проблему. Мне нужно, чтобы даже это было превращено в код 500
.
Возможно ли это в PHP? Или мне нужно сделать это на более высоком уровне, например, используя mod_rewrite
? Если это так, любая идея, как я это установил?
Ответы
Ответ 1
Я проверил документы PHP для заголовка(), и это было проще, чем я делал это - если второй параметр равен true, он будет замените аналогичный заголовок. значение по умолчанию - true. Поэтому правильное поведение - это заголовок ('HTTP/1.1 403 Forbidden');
, затем выполните логику аутентификации, а затем, если он аутентифицируется, выполните заголовок ('HTTP/1.1 200 OK')
. Он заменит ответ 403 и будет гарантировать, что значение по умолчанию - 403.
Ответ 2
Просто отправьте код состояния в ответ header()
:
header('HTTP/1.1 500 Internal Server Error');
Помните, что при отправке этого файла не должен быть выходным. Это означает, что нет вызовов echo
, а не HTML или пробелов.
Ответ 3
Начиная с PHP 5.4.0 существует специализированная функция:
<?php http_response_code( 500 ); ?>
Просто убедитесь, что он вызывается перед любым другим выводом.
Ссылка:
Ответ 4
На странице 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 и останавливает выполнение оставшейся части script.
Ответ 5
header($_SERVER['SERVER_PROTOCOL'] . ' 403 Forbidden');
Не следует использовать 500, что указывает на внутреннюю ошибку сервера.
Этот (и другие заголовки) должен быть отправлен до любого выхода, кроме случаев, когда включена буферизация вывода.
Ответ 6
Любопытно, если вы когда-нибудь выяснили, как заставить PHP возвращать 500 на ошибки Parse... У меня такая же точная потребность... API отправляет в наше приложение и ожидает 200, только если все было обработано правильно...
В случае ошибки Parse PHP возвращает ошибку 200, и я использовал обе эти функции:
register_shutdown_function()
set_error_handler()
и они не попадают, когда в коде возникает ошибка "синтаксис/синтаксис"...
Итак, это низкоуровневая PHP-функция, которая должна быть установлена в PHP.INI или где-то... Я использую PHP 5.3.10...
Ответ 7
Используйте буферизацию вывода, чтобы вы могли изменять заголовки после записи в тело страницы. Вы можете установить это в ini file, а не обновлять каждый script.
(Обратите внимание, что вызов header() все равно не будет выполнен, если вы явно очистите выходной буфер)
С.