Ant*_*nna 36
直接回答:你做不到.只要PHP看到multipart/form-data Content-Type,它就会坚持自己解析它.原始数据将无法使用.可悲的是.但你可以破解它.
我遇到了类似的问题,合作伙伴发送格式错误的数据作为multipart/form-data,PHP无法解析它并且没有发布它所以我可以自己解析它.
解决方案?我把它添加到我的apache conf:
<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>
Run Code Online (Sandbox Code Playgroud)
这会将传入请求的Content-Type从multipart/form-data更改为XXX.php到multipart/form-data-alternate,这足以阻止PHP尝试解析它
在此之后,您最终可以从php://输入读取整个原始数据并自行解析.
这很丑陋,但我没有找到更好或实际上任何其他解决方案 - 没有要求合作伙伴来解决他们的问题.
NB!当你按照我在这里描述的那样做时,$ _FILES将为空.
小智 5
我没有完全实现它,但它看起来应该工作.在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
Run Code Online (Sandbox Code Playgroud)
设置Content-Typeto application/x-httpd-php似乎解决了PHP解析主体的原始问题,而Norbert Farkas报告的问题是:"Apache发回PHP源代码".然后可以使用正文php://input,并在X-Real-Content-Type标题中输入实际内容类型.(那个标题对你来说可能不是必需的 - MULTIPART_CTYPE变量似乎没有显示在我的中$_ENV,但新的标题确实出现了.)所有其他请求应该像往常一样处理.
感谢Anti Veeranna的大部分内容!:)
编辑:PS显然它是特定于Apache的,但在PHP的其他一些配置中,可能有更简单的方法.