respuesta injector estado errores error códigos código codigos codigo code php http response

php - injector - Cómo devolver un código HTTP 500 en cualquier error, sin importar qué



http error 431 (7)

Curioso si alguna vez descubrió cómo obtener PHP para devolver 500 en errores de Parse ... Tengo exactamente la misma necesidad ... API está publicando en nuestra aplicación y espera un 200 solo si todo se procesó correctamente ...

En el caso de un error Parse, PHP devuelve un Error 200 y he usado ambas funciones:

register_shutdown_function () set_error_handler ()

y estos no se ven afectados cuando ocurre un error de "análisis / sintaxis" en el código ...

Entonces, esta es una función de PHP de bajo nivel que debería configurarse en PHP.INI o en algún otro lugar ... Estoy usando PHP 5.3.10 ...

Estoy escribiendo un script de autenticación en PHP, para ser llamado como una API, que necesita devolver 200 only in the case that it approves the request, and 403 (Forbidden) or 500` de lo contrario.

El problema que estoy encontrando es que php devuelve 200 en el caso de condiciones de error, generando el error como html en su lugar. ¿Cómo puedo asegurarme de que php devolverá un código HTTP 500 menos que yo mismo devuelva el HTTP 200 o el HTTP 403 ? En otras palabras, quiero convertir todas las condiciones de advertencia o error en 500 s, sin excepciones, de modo que el caso predeterminado sea rechazar la solicitud de autenticación, y la excepción lo apruebe con un código 200 .

He set_error_handler() con set_error_handler() y error_reporting() , pero hasta ahora no he tenido suerte. Por ejemplo, si el código genera algo antes de que envíe el código de respuesta HTTP, PHP naturalmente informa que no puede modificar la información del encabezado después de emitir algo. Sin embargo, esto es reportado por PHP como un código de respuesta 200 con html que explica el problema. Necesito que incluso este tipo de cosas se conviertan en un código 500 .

¿Es esto posible en PHP? ¿O necesito hacer esto en un nivel superior como usar mod_rewrite alguna manera? Si ese es el caso, ¿alguna idea de cómo lo configuré?


En la página php para set_error_handler () puede encontrar un comentario por smp en ncoastsoft dot com publicado el 8 de septiembre de 2003 10:28 que explica cómo incluso detectar errores fatales (que normalmente no puede detectar con un controlador de errores personalizado). Cambié el código para tus necesidades:

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();

Este shold captura el error fatal de la función no existente. Devuelve un 500 y detiene la ejecución del resto del script.


Revisé header() , y es más simple de lo que lo estaba haciendo; si el segundo parámetro es verdadero, reemplazará un encabezado similar. El defecto es cierto. Entonces, el comportamiento correcto es el encabezado (''HTTP/1.1 403 Forbidden''); , luego haga la lógica de autenticación, luego, si se autentica, haga el encabezado (''HTTP/1.1 200 OK'') . Reemplazará la respuesta 403 y garantizará que 403 sea el valor predeterminado.


Simplemente envíe el código de estado como un header() respuesta header() :

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

Recuerde que al enviar esto no debe haber ninguna salida antes. Eso significa que no hay llamadas de echo y no HTML o espacios en blanco.


Use el búfer de salida para permitirle modificar los encabezados después de escribir en el cuerpo de la página. Puede establecer esto en el archivo ini en lugar de actualizar cada script.

(Tenga en cuenta que la llamada al encabezado () seguirá fallando si usted vacía explícitamente el búfer de salida)

DO.



header($_SERVER[''SERVER_PROTOCOL''] . '' 403 Forbidden'');

No debe usar 500, eso indica un error interno del servidor.

Este (y otros encabezados) deben enviarse antes de cualquier salida, excepto si tiene el búfer de salida habilitado.