Подтвердить что ты не робот

Как вернуть код 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? Если это так, любая идея, как я это установил?

4b9b3361

Ответ 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() все равно не будет выполнен, если вы явно очистите выходной буфер)

С.