Я пишу сценарий аутентификации в PHP, чтобы быть названным как API, который должен возвратиться 200only 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, никакие исключения, так, чтобы случай по умолчанию отклонил запрос аутентификации и исключение, не утверждают его с a 200
код.
Я играл с set_error_handler()
и error_reporting()
, но до сих пор никакая удача. Например, если код производит что-то, прежде чем я отправлю код ответа HTTP, PHP естественно сообщает, что Вы не можете изменить информацию заголовка после вывода ничего. Однако об этом сообщает PHP как a 200
код ответа с HTML, объясняющим проблему. Мне нужна даже такого рода вещь, в которую превратятся a 500
код.
Действительно ли это возможно в PHP? Или сделайте я должен сделать это в более высоком уровне как использование mod_rewrite
так или иначе? Если это так, какая-либо идея, как я настроил это?
Я проверил документацию PHP для header(), и это проще, чем я делал - если второй параметр истинен, он заменит аналогичный заголовок. значение по умолчанию верно. Таким образом, правильное поведение: заголовок ('HTTP/1.1 403 Forbidden');
, затем выполните логику аутентификации, затем, если она аутентифицируется, выполните заголовок ('HTTP/1.1 200 OK')
. Он заменит ответ 403 и гарантирует, что 403 будет использоваться по умолчанию.
На странице 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 и останавливает выполнение остальной части скрипта.
header($_SERVER['SERVER_PROTOCOL'] . ' 403 Forbidden');
Вы не должны использовать 500, это означает внутреннюю ошибку сервера.
Этот (и другие заголовки) должен быть отправлен перед любым выводом, за исключением случаев, когда у вас включена буферизация вывода.
Используйте буферизацию вывода, чтобы иметь возможность изменять заголовки после записи в тело страницы. Вы можете установить это в ini файле, а не обновлять каждый скрипт.
(Обратите внимание, что вызов header() все равно не сработает, если вы явно очистите буфер вывода)
C.
Просто отправьте код состояния в качестве ответа header()
:
header('HTTP/1.1 500 Internal Server Error');
Помните, что при отправке этого не должно быть никакого вывода перед ним. Это означает, что нет вызовов echo
и нет HTML или пробельных символов.