PHP (Apache) 默默地将 HTTP 429 和其他转换为 500

标签 php apache http-headers http-status-code-429

我刚刚在 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)进行测试时一切正常。

如果我是显式的并发送 header ('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

最佳答案

它是 Apache,99% 肯定,我无法在它的文档中直接找到它,但我可以从下面的测试中推断它(Apache 版本 2.2.22)

在你的配置中添加:

ErrorDocument 429 Aaargh to heavy

重启:

$ sudo /etc/init.d/apache2 restart
Syntax error on line 6 of /etc/apache2/conf.d/localized-error-pages:
Unsupported HTTP response code 429
Action 'configtest' failed.
The Apache error log may have more information.
   ...fail!

429 也是 seems a recent addition in rfc6585 , 状态:提议,日期:2012 年 4 月。HTTP RFC 的一岁是……根据我的经验,这只是一个婴儿。再加上在 Apache 中获取它的过程,然后在您的包存储库中...好吧,您可以尝试 Apache 2.4...

关于PHP (Apache) 默默地将 HTTP 429 和其他转换为 500,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17735514/

相关文章:

php - 如何根据用户输入创建链接

php - 语句在不应该返回 false 时返回

php - JQuery 和 PHP Cookie

apache - htaccess - 删除 index.php 并保留一个没有键的变量

java - 如何使用 Apache Shiro 检查用户是否已经登录?

c# - 默认 HTTP header 是否有任何常量?

php - SQL 查询返回无意义的结果

apache - Hadoop/map-reduce : Total time spent by all maps in occupied slots vs. 所有map任务花费的总时间

swift - alamofire和URLSession中上传数据key,如何添加?

php - 在屏幕上打印响应标题的消息