我刚刚在 PHP 的 header() 方法中发现了一个奇怪的地方,它默默地将我的一些状态转换为 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 方法需要一个整数,它用作 php 的 header() 函数的第三个参数。
从那以后我发现它似乎专门适用于 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