PHP:如何使用传输编码读取 POST 正文:分块,无内容长度

tyr*_*rel 2 php apache http-headers

我正在编写一项服务来从我家的能源监控设备接收数据。设备推送数据的唯一方法是使用 HTTP POST、 withTransfer-Encoding: chunked和 no Content-Length,并在请求正文中使用 XML 形式的数据。

我希望能够在 PHP 脚本(Apache 后面)中读取这些数据并将其存储在我的数据库中。

看来现在在 PHP 中读取 HTTP 请求正文的最正确方法是打开并读取php://input. 然而,PHP 网站上用户的评论表明(并且我的测试证实),如果Content-Length客户端未指定标头,php://input则不会返回任何数据(即使客户端以分块编码发送数据)。

是否有其他方法可以访问请求正文?我可以配置 Apache(使用 .htaccess)来解码分块数据并在获取全部数据后调用我的脚本吗Content-Length?或者配置 PHP 以便它能够处理这个问题?

谢谢!

fic*_*scr 6

我想不妨写这个作为答案。

您描述的问题记录在此处:https ://bugs.php.net/bug.php?id=60826

线程的亮点:

这就是我发现的。如果您发送分块的 http 请求但不发送内容长度(正如我们应该使用 HTTP 1.1 协议所做的那样),则请求的正文部分为空(php://input 不返回任何内容)。此结果对于 PHP 通过 FastCGI 运行的以下配置仍然有效:

与 PHP 作为 mod_php 运行相同的配置就可以了,正文请求可通过 php://input 获得。

本质上,PHP 遵循规范,并且不会读取超出 FastCGI CONTENT_LENGTH 标头值的内容 - 因此正确的修复必然位于 PHP 之上、FastCGI 或 Web 服务器实现中。

可能的解决方法:

0) 将 httpd 与 mod_php 一起使用

1) 使用不同的网络服务器。

2) 查看 mod_fcgid 的补丁

3)也许(不推荐)翻转一下,看看$HTTP_RAW_POST_DATAalways_populate_raw_post_data中有没有什么