我正在尝试从第三方提供商处检索数据。他们通过Content-Type: application/x-www-form-urlencoded
向我们发送数据。最后,我们解析$_POST
和$_GET
变量中的数据,如下所示:
print_r($_POST);
print_r($_GET);
数组是空的:
Array
(
)
Array
(
)
我也尝试使用file_get_contents('php://input')
获取数据,但它会打印一个空字符串。
检查$_SERVER
变量,我们注意到content-type
确实是application/x-www-form-urlencoded
,而REQUEST_METHOD
确实是POST
。
有没有人指出我们可以访问所发送数据的位置?
(我们通过使用RequestBin中的网址更改网址并查看其中的数据,确保问题出在我们手中。)
修改
我们使用http://requestb.in切换网址时得到的回复:
amount: 2200
pay_from_email: [REDACTED]
lma_transaction_id: [REDACTED]
md5sig: [REDACTED]
transaction_id: 761
merchant_fields: cart_id
lma_amount: 2200
status: 2
pay_to_email: [REDACTED]
cart_id: 11242
merchant_id: [REDACTED]
请求的标头是:
X-Request-Id: [REDACTED]
User-Agent: [REDACTED]
Connection: close
Content-Type: application/x-www-form-urlencoded
Host: requestb.in
Content-Length: 326
修改
var_dump(getallheaders());
打印:
[User-Agent] => [REDACTED] (Name of the third-party provider)
[Content-Type] => application/x-www-form-urlencoded
[Host] => [REDACTED]
修改
apache_request_headers()
打印:
[Host] => [REDACTED]
[DNT] => 1
[Cookie] => [REDACTED]
[Connection] => keep-alive
[Accept] => text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
[User-Agent] => Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.74.9 (KHTML, like Gecko) Version/7.0.2 Safari/537.74.9
[Accept-Language] => fr-fr
[Accept-Encoding] => gzip, deflate
[Cache-Control] => max-age=0
答案 0 :(得分:0)
确保,在php.ini中:
track_vars
(仅在非常旧的PHP版本上提供)设置为On
variables_order
包含字母P post_max_size
设置为
合理的价值(例如8 MB)suhosin.post.max_vars
和suhosin.request.max_vars
很大
足够答案 1 :(得分:0)
我的回答不是一个解决方案,而是你所问的指针。
这些是您提到的事实:
$_SERVER['REQUEST_METHOD']
确认请求处于POST状态。Content-Length
标头。Content-Length
标头。不幸的是,如果没有Content-Length
,我就无法发送POST请求,所以我不知道这是否真的是你问题的根源。它完全取决于Apache + PHP,如果这个标头不可用,我该如何反应,我无法找到任何地方说如果POST请求没有附带会发生什么。没有它,PHP无法构造$ _POST数组,但这只是猜测。
无论如何,将此标头发送到requestb.in但不是您的脚本的事实是我们需要关注的全部内容。当我有新的话要说时,我会更新我的答案,但现在这就是全部。
<强> [UPDATE] 强>
使用NetTool我设法测试了不同的标头组合,并且PHP无法填充$ _POST数组的唯一情况是请求确实有Content-Type
标头。即使这样,file_get_contents('php://input')
也会显示原始传入的帖子数据。
回到Content-Length
,NetTool允许我省略此标题而不发送它,但无论是否发送,PHP脚本都会在请求中显示此标头的存在!我不确定它是否真的没有被发送,在这种情况下,Apache在填充PHP之前填补空白,或者NetTool在没有告诉我的情况下发送它。
只有可以调试问题的方法是使用mod_dumpio在传入PHP之前转储所有传入的帖子数据。这样,您可以确定传入的请求是否实际包含任何数据,或者它是否为空。
<强> [UPDATE] 强>
最后,我设法使用NetTool的隧道功能来监控随请求发送的实际标头。不幸的是,即使我告诉NetTool不发送Content-Length
它仍会发送。在我看来,它是不可避免的。在这种情况下,它也可能是您的问题的原因。我的意思是如果这个标题不存在,那么PHP可能无法构造$ _POST数组。