Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 获取原始post数据_Php_Request - Fatal编程技术网

Php 获取原始post数据

Php 获取原始post数据,php,request,Php,Request,根据php手册php://input $HTTP\u RAW\u POST\u数据都不能处理多部分/表单数据POST请求 "php://input 允许您读取原始POST数据。它是$HTTP\u raw\u POST\u data的内存密集型替代品,不需要任何特殊的php.ini指令。php://input 不适用于enctype=“多部分/表单数据” 如何获取多部分/表单数据的原始数据?直接回答:您不能这样做。每当PHP看到multipart/form数据内容类型时,它就坚持自己解析它。您将无

根据php手册php://input
$HTTP\u RAW\u POST\u数据
都不能处理
多部分/表单数据
POST请求

"php://input 允许您读取原始POST数据。它是
$HTTP\u raw\u POST\u data
的内存密集型替代品,不需要任何特殊的php.ini指令。php://input 不适用于
enctype=“多部分/表单数据”


如何获取多部分/表单数据的原始数据?

直接回答:您不能这样做。每当PHP看到multipart/form数据内容类型时,它就坚持自己解析它。您将无法使用原始数据。悲哀地但你可以绕过它

我遇到了一个类似的问题,一个合作伙伴将格式错误的数据作为多部分/表单数据发送,PHP无法解析它,也没有给出它,所以我可以自己解析它

解决方案是什么?我在apache配置中添加了以下内容:

<Location "/backend/XXX.php">
    SetEnvIf Content-Type ^(multipart/form-data)(.*) NEW_CONTENT_TYPE=multipart/form-data-alternate$2 OLD_CONTENT_TYPE=$1$2
    RequestHeader set Content-Type %{NEW_CONTENT_TYPE}e env=NEW_CONTENT_TYPE
</Location> 

SetEnvIf内容类型^(多部分/表单数据)(*)新内容类型=多部分/表单数据替换$2旧内容类型=$1$2
RequestHeader集合内容类型%{NEW_Content_Type}e env=NEW_Content_Type
这将把传入请求的内容类型从multipart/form data改为multipart/form data alternate改为XXX.php,这足以阻止php尝试解析它

在此之后,您最终可以从中读取整个原始数据php://input 然后自己解析它

这很难看,但我没有找到更好的解决办法,事实上也没有找到任何其他解决办法——除了要求对方纠正自己的错误


注意!当您执行我在这里描述的操作时,$\u文件将为空。

我没有完全实现这一点,但它看起来应该可以工作。在Apache conf中:

SetEnvIf Content-Type ^(multipart/form-data)(.*) MULTIPART_CTYPE=$1$2
RequestHeader set Content-Type application/x-httpd-php env=MULTIPART_CTYPE
RequestHeader set X-Real-Content-Type %{MULTIPART_CTYPE}e env=MULTIPART_CTYPE
Content Type
设置为
application/x-httpd-php
似乎解决了php解析主体的原始问题,问题Norbert Farkas报告:“Apache发回php源代码”。然后可在
php://input
,以及
X-real-content-type
标题中的实际内容类型。(您可能不需要该标头--
MULTIPART\u CTYPE
变量似乎没有显示在我的
$\u ENV
中,但新标头显示了。)所有其他请求都应该像往常一样处理

多亏了反Veeranna的大力支持!:)

编辑:另一方面,显然它是特定于Apache的,但在其他一些PHP配置中,可能有更简单的方法。

您可以设置,PHP不会截获
多部分/表单数据


要求:PHP5.4

如果是为了计算字节数,您不能将$HTTP\u RAW\u POST\u数据字节数与任何$\u文件的字节数结合起来吗?@karim79,因为它不是。如果以这种方式替换内容类型头,我将在浏览器中返回PHP源代码。php引擎似乎不会处理这个请求。诀窍是什么?我使用了不同的头替换,没有一个有效。似乎可以用@Pacerier-可能,我的答案是在PHP5.4之前写的。特别是当其他地方的PHP手册坚持在
多部分/表单数据
@Anshul的情况下不可能获得原始正文时,手册是否仍然声明了这一点?这本手册没有连贯的版本。有些页面是版本X,而其他页面是版本Z。@Pacerier,我仍然认为不可能获取原始的多部分/表单数据。以下所有链接都表明:@Anshul,
enable\u post\u data\u reading=Off
提供了原始的多部分/表单数据,不是吗?@Pacerier,你说得对。我可以用电脑阅读任何类型的帖子数据php://input 当enable_post_data_reading设置为off时。使用Apache以及PHP内置的web服务器进行测试。需要为此更新文档。不幸的是,我以前试图在那里做些小改动,但没有成功(