【发布时间】:2013-12-19 22:13:22
【问题描述】:
我在 Linux 上运行 Apache2 和 PHP 5,但 php://input 流出现了一些奇怪的行为。
对于某些 GET 请求,流并不像应有的那样为空。相反,php://input 流包含整个 GET 请求。我已经解决了这个问题,但我想知道我是否应该提交一个关于这个问题的错误,或者它是否是“理想但未记录的”行为。
详情
在请求处理的早期,我调用:
$in = file_get_contents('php://input');
if ( !empty($in) )
$post_data = json_decode($in);
if ( !empty($in) && is_null($post_data) ) {
// output some error info and exit
}
通常,当请求没有正文时,$in 为空,并且一切正常。但有时 GET 请求会有一个主体,而该主体将是整个请求。当然,您不能对这些数据进行 json 解码,并且会遇到错误条件。
这只发生在 一些 请求中。例如,此请求不会出现错误:
GET /os/invitations/kkkkkk HTTP/1.1
Host: our.machine.com
Content-Type: application/json
Authorization: Basic aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa==
但是这个通过一些代理和 VPN 路由的请求确实会触发错误。
GET http://some.proxy.at.some.big.company.com:7080/cvp-out/cmmproxy/os/invitations/d66065566dba541c8ba6a70329684645 HTTP/1.1
Content-Type: application/json
Authorization: Basic aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa==
Clientid: abc
User-Agent: Java/1.6.0
Host: some.proxy.at.some.big.company.com:7080
Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
Connection: keep-alive
X-Remote-Addr: 53.231.244.171
X-Remote-Host: 53.231.244.171
X-Server-Name: some.proxy.at.some.big.company.com
X-Server-Port: 7080
X-Scheme: http
我花了 小时 将其视为路由/调度问题,但结果却是我们的代码。当然,修复是只在您期望数据时从输入流中读取:
if ( in_array( $_SERVER['REQUEST_METHOD'], array('PUT', 'POST') )) {
$in = file_get_contents('php://input');
if ( !empty($in) )
$post_data = json_decode($in);
}
这是一个已知问题吗?它会发生不可预测吗?我应该提交错误吗?
【问题讨论】: