Я только что обнаружил странность в методе PHP header(), молча преобразовывая некоторые из моих статусов в 500. Так как мне не повезло найти упоминание об этом поведении в различных веб-поисках, я добавляю это здесь в надежде спасти другие - некоторое обострение, но также спросить, нашел ли кто-нибудь лучшее обходное решение (с PHP или Zend1), чем я придумал.
Учитывая простой PHP script как:
<?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 слишком много запросов" ); Это было бы полезным обходным решением, за исключением того, что я использую Zend Framework, а метод setHttpResponseCode ожидает целое число, которое он использует в качестве третьего параметра для функции php header().
С тех пор я обнаружил, что он, похоже, относится к статусам, добавленным в RFC 6585 (см. https://github.com/php/php-src/pull/274), хотя я немного запутались, почему такие статусы, как 426, работают, когда они явно не присутствуют в исходном коде 5.4.14 и 5.4.16 (две версии, которые я тестировал), но не функциональные, такие как 429.
Update:
Как показали ответы, это в основном проблема Apache, а не PHP, я обновил заголовок соответственно. Самое интересное, похоже, что это исправлено только в некоторых версиях Apache (без видимой согласованности между старым и новым). Я считаю, что проблема с восходящим потоком находится здесь: https://issues.apache.org/bugzilla/show_bug.cgi?id=44995