PHP (Apache) convirtiendo silenciosamente HTTP 429 y otros a 500
Acabo de descubrir una rareza en el método de encabezado () de PHP, convirtiendo silenciosamente algunos de mis estados a 500. Como no tuve suerte en encontrar una mención de este comportamiento en varias búsquedas en la web, lo agregué aquí con la esperanza de ahorrarle a los demás alguna molestia. , pero también para preguntar si alguien ha descubierto una solución mejor (ya sea con PHP o Zend1) de la que he encontrado.
Dado un simple script PHP como:
<?php
header('HTTP/1.1 429');
echo "Too Many Requests\n";
Espero recibir algo como:
HTTP/1.1 429
Date: Thu, 18 Jul 2013 22:19:45 GMT
Content-Length: 11
Content-Type: text/html; charset=UTF-8
Too Many Requests
En cambio, en realidad devuelve:
HTTP/1.1 500 Internal Server Error
Date: Thu, 18 Jul 2013 22:19:45 GMT
Content-Length: 11
Content-Type: text/html; charset=UTF-8
Too Many Requests
Agregando al misterio, no hay eventos en mi registro de errores de apache, y el registro de acceso muestra el código de estado correcto (por lo tanto, diferente de lo que se envió al navegador):
$IP - - [18/Jul/2013:16:31:34 -0700] "GET /test/429.php HTTP/1.1" 429 11 "-" "curl/7.30.0"
Todo funciona bien cuando se prueba con muchos otros códigos de estado como 401, 420, 426.
Todo también funciona bien si soy explícito y envío el encabezado ('HTTP / 1.1 429 Too Many Requests'); Esta sería una solución útil, excepto que estoy usando Zend Framework y su método setHttpResponseCode espera un entero, que usa como tercer parámetro para la función header () de php.
Desde entonces, he descubierto que parece aplicarse específicamente a los estados agregados en RFC 6585 (verhttps://github.com/php/php-src/pull/274), aunque estoy un poco confundido por qué los estados como 426 funcionan cuando claramente no están presentes en el código fuente para 5.4.14 y 5.4.16 (las dos versiones que he probado) pero no funcionales como 429 son.
Actualizar:
Como las respuestas han indicado, esto es principalmente un problema de Apache, no PHP, he actualizado el título en consecuencia. Lo más interesante parece ser que esto se soluciona solo en ciertas versiones de Apache (sin aparente coherencia entre lo antiguo y lo nuevo). Creo que el tema anterior en cuestión está aquí:https://issues.apache.org/bugzilla/show_bug.cgi?id=44995