php - pagina - http status codes
PHP: ¿Cómo enviar el código de respuesta HTTP? (7)
Tengo un script PHP que necesita responder con códigos de respuesta HTTP (códigos de estado), como HTTP 200 OK, o algún código 4XX o 5XX.
¿Cómo puedo hacer esto en PHP?
Acabo de encontrar esta pregunta y pensé que necesitaba una respuesta más completa:
A partir de PHP 5.4 hay tres métodos para lograr esto:
Ensamblando el código de respuesta por su cuenta (PHP> = 4.0)
La función header()
tiene un caso de uso especial que detecta una línea de respuesta HTTP y le permite reemplazarla con una personalizada
header("HTTP/1.1 200 OK");
Sin embargo, esto requiere un tratamiento especial para (Rápido) CGI PHP:
$sapi_type = php_sapi_name();
if (substr($sapi_type, 0, 3) == ''cgi'')
header("Status: 404 Not Found");
else
header("HTTP/1.1 404 Not Found");
Nota: De acuerdo con el RFC de HTTP , la frase de motivo puede ser cualquier cadena personalizada (que cumpla con el estándar), pero por el bien de la compatibilidad del cliente , no recomiendo colocar una cadena aleatoria allí.
Nota: php_sapi_name()
requiere PHP 4.0.1
3er argumento a la función de cabecera (PHP> = 4.3)
Obviamente hay algunos problemas al usar esa primera variante. Lo más importante de lo que creo es que está parcialmente analizado por PHP o el servidor web y está mal documentado.
Desde la versión 4.3, la función de header
tiene un tercer argumento que le permite configurar el código de respuesta de manera cómoda, pero su uso requiere que el primer argumento sea una cadena no vacía. Aquí hay dos opciones:
header('':'', true, 404);
header(''X-PHP-Response-Code: 404'', true, 404);
Recomiendo el segundo . El primero funciona en todos los navegadores que he probado, pero algunos navegadores menores o rastreadores web pueden tener un problema con una línea de encabezado que solo contiene dos puntos. El nombre del campo de encabezado en el 2do. la variante, por supuesto, no está estandarizada de ninguna manera y podría modificarse, simplemente elegí un nombre con suerte descriptivo.
Función http_response_code (PHP> = 5.4)
La función http_response_code()
se introdujo en PHP 5.4 y facilitó mucho las cosas.
http_response_code(404);
Eso es todo.
Compatibilidad
Aquí hay una función que he preparado cuando necesitaba compatibilidad por debajo de 5.4, pero quería la funcionalidad de la "nueva" función http_response_code
. Creo que PHP 4.3 es más que suficiente compatibilidad con versiones anteriores, pero nunca se sabe ...
// For 4.3.0 <= PHP <= 5.4.0
if (!function_exists(''http_response_code''))
{
function http_response_code($newcode = NULL)
{
static $code = 200;
if($newcode !== NULL)
{
header(''X-PHP-Response-Code: ''.$newcode, true, $newcode);
if(!headers_sent())
$code = $newcode;
}
return $code;
}
}
Agregue esta línea antes de cualquier salida del cuerpo, en el caso de que no esté utilizando el búfer de salida.
header("HTTP/1.1 200 OK");
Reemplace la parte del mensaje (''OK'') con el mensaje apropiado y el código de estado con su código según corresponda (404, 501, etc.)
Con la función de header . Hay un ejemplo en la sección sobre el primer parámetro que toma.
Desafortunadamente, las soluciones presentadas por @dualed tienen varias fallas.
El uso de
substr($sapi_type, 0, 3) == ''cgi''
no es suficiente para detectar CGI rápido. Cuando se utiliza PHP-FPM FastCGI Process Manager,php_sapi_name()
devuelve fpm no cgiFasctcgi y php-fpm exponen otro error mencionado por @Josh: usar el
header(''X-PHP-Response-Code: 404'', true, 404);
funciona correctamente bajo PHP-FPM (FastCGI)header("HTTP/1.1 404 Not Found");
puede fallar cuando el protocolo no es HTTP / 1.1 (es decir, ''HTTP / 1.0''). El protocolo actual se debe detectar usando$_SERVER[''SERVER_PROTOCOL'']
(disponible desde PHP 4.1.0Hay al menos 2 casos al llamar a
http_response_code()
resulta en un comportamiento inesperado:- Cuando PHP encuentra un código de respuesta HTTP que no comprende, PHP reemplazará el código con uno que conoce del mismo grupo. Por ejemplo, "521 servidor web está inactivo" se reemplaza por "500 Error interno del servidor". Muchos otros códigos de respuesta no comunes de otros grupos 2xx, 3xx, 4xx se manejan de esta manera.
- En un servidor con php-fpm y nginx http_response_code () función PUEDE cambiar el código como se esperaba pero no el mensaje. Esto puede resultar en un encabezado extraño "404 OK" por ejemplo. Este problema también se menciona en el sitio web de PHP por un comentario de usuario http://www.php.net/manual/en/function.http-response-code.php#112423
Para su referencia, aquí está la lista completa de códigos de estado de respuesta HTTP (esta lista incluye códigos de los estándares de Internet IETF así como otros RFC de IETF. Muchos de ellos NO son compatibles actualmente con la función PHP_response_code de PHP): http://en.wikipedia.org/wiki/List_of_HTTP_status_codes
Puedes probar este error fácilmente llamando a:
http_response_code(521);
El servidor enviará el código de respuesta HTTP "500 Error interno del servidor", lo que dará como resultado errores inesperados si, por ejemplo, tiene una aplicación cliente personalizada que llama a su servidor y espera algunos códigos HTTP adicionales.
Mi solución (para todas las versiones de PHP desde 4.1.0):
$httpStatusCode = 521;
$httpStatusMsg = ''Web server is down'';
$phpSapiName = substr(php_sapi_name(), 0, 3);
if ($phpSapiName == ''cgi'' || $phpSapiName == ''fpm'') {
header(''Status: ''.$httpStatusCode.'' ''.$httpStatusMsg);
} else {
$protocol = isset($_SERVER[''SERVER_PROTOCOL'']) ? $_SERVER[''SERVER_PROTOCOL''] : ''HTTP/1.0'';
header($protocol.'' ''.$httpStatusCode.'' ''.$httpStatusMsg);
}
Conclusión
La implementación de http_response_code () no admite todos los códigos de respuesta HTTP y puede sobrescribir el código de respuesta HTTP especificado con otro del mismo grupo.
La nueva función http_response_code () no resuelve todos los problemas involucrados, pero hace que las cosas empeoren al introducir nuevos errores.
La solución de "compatibilidad" ofrecida por @dualed no funciona como se esperaba, al menos bajo PHP-FPM.
Las otras soluciones ofrecidas por @dualed también tienen varios errores. La detección rápida de CGI no maneja PHP-FPM. El protocolo actual debe ser detectado.
Cualquier prueba y comentarios son apreciados.
Si estás aquí debido a que Wordpress da 404 al cargar el entorno, esto debería solucionar el problema:
define(''WP_USE_THEMES'', false);
require(''../wp-blog-header.php'');
status_header( 200 );
//$wp_query->is_404=false; // if necessary
El problema se debe a que envía un encabezado Estado: 404 No encontrado. Tienes que anular eso. Esto también funcionará:
define(''WP_USE_THEMES'', false);
require(''../wp-blog-header.php'');
header("HTTP/1.1 200 OK");
header("Status: 200 All rosy");
desde PHP 5.4 puede usar http_response_code()
para obtener y configurar el código de estado del encabezado.
aquí un ejemplo:
<?php
// Get the current response code and set a new one
var_dump(http_response_code(404));
// Get the new response code
var_dump(http_response_code());
?>
Aquí está el documento de esta función en php.net:
header("HTTP/1.1 200 OK");
http_response_code(201);
http_response_code (200); no funciona porque la alerta de prueba 404 https://developers.google.com/speed/pagespeed/insights/