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

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

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

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

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

45
задан gturri 22 December 2017 в 14:25
поделиться

5 ответов

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

20
ответ дан 26 November 2019 в 20:54
поделиться

На странице php для set_error_handler() вы можете найти комментарий smp at ncoastsoft dot com posted on 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 и останавливает выполнение остальной части скрипта.

12
ответ дан 26 November 2019 в 20:54
поделиться
header($_SERVER['SERVER_PROTOCOL'] . ' 403 Forbidden');

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

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

5
ответ дан 26 November 2019 в 20:54
поделиться

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

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

C.

1
ответ дан 26 November 2019 в 20:54
поделиться

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

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

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

77
ответ дан 26 November 2019 в 20:54
поделиться
Другие вопросы по тегам:

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