Как вернуть код HTTP 500 при любой ошибке, независимо от того, что - PullRequest
44 голосов
/ 16 июня 2010

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

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

Ответы [ 7 ]

74 голосов
/ 16 июня 2010

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

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

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

20 голосов
/ 26 августа 2010

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

14 голосов
/ 27 ноября 2013

начиная с PHP 5.4.0 для этого есть специальная функция http_response_code(), то есть:

<?php
  http_response_code(404);
?>

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

11 голосов
/ 16 июня 2010

На странице 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();

Это shold перехватывает фатальную ошибку несуществующей функции. Она возвращает 500 и останавливает выполнение остальной части скрипта.

5 голосов
/ 16 июня 2010
header($_SERVER['SERVER_PROTOCOL'] . ' 403 Forbidden');

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

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

2 голосов
/ 05 января 2013

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

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

register_shutdown_function () set_error_handler ()

и они не попадают, когда в коде происходит ошибка "синтаксический анализ / синтаксис" ...

Так что это низкоуровневая функция PHP, которую нужно установить в PHP.INI или где-то еще ... Я использую PHP 5.3.10 ...

1 голос
/ 16 июня 2010

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

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

C.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...