PHP (Apache) тихо конвертирует HTTP 429 и другие в 500

Я только что обнаружил странность в методе header () PHP, тихо преобразующем некоторые из моих статусов в 500. Поскольку мне не повезло найти упоминание об этом поведении в различных поисках в Интернете, я добавляю это здесь в надежде спасти других от обострения , но также спросить, нашел ли кто-нибудь лучший обходной путь (с помощью PHP или Zend1), чем я придумал.

Имеется простой скрипт PHP, например:

<?php
header('HTTP/1.1 429');
echo "Too Many Requests\n";

Я ожидаю получить что-то вроде:

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

Вместо этого это фактически возвращает:

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

В дополнение к тайне, в моем журнале ошибок apache нет событий, и журнал доступа показывает правильный код состояния (таким образом, он отличается от того, что было отправлено в браузер):

$IP - - [18/Jul/2013:16:31:34 -0700] "GET /test/429.php HTTP/1.1" 429 11 "-" "curl/7.30.0"

Все отлично работает при тестировании со многими другими кодами состояния, такими как 401, 420, 426.

Все также работает нормально, если я явно и отправляю заголовок ('HTTP / 1.1 429 Too Many Requests'); Это был бы полезный обходной путь, за исключением того, что я использую Zend Framework и его метод setHttpResponseCode ожидает целое число, которое он использует в качестве третьего параметра функции header () php.

С тех пор я обнаружил, что это, кажется, относится конкретно к статусам, добавленным в RFC 6585 (см.https://github.com/php/php-src/pull/274), хотя меня немного смущает, почему такие состояния, как 426, работают, когда они явно отсутствуют в исходном коде для 5.4.14 и 5.4.16 (две версии, с которыми я тестировал), но не функциональные, такие как 429 находятся.

Обновить:

Как указывалось в ответах, это в основном проблема Apache, а не PHP, я соответственно обновил заголовок. Наиболее интересным представляется то, что это исправлено только в определенных версиях Apache (без видимой согласованности между старой и новой). Я полагаю, что проблема выше по течению находится здесь:https://issues.apache.org/bugzilla/show_bug.cgi?id=44995

Ответы на вопрос(2)

Ваш ответ на вопрос