file_get_contents('php://input')无法工作。为空-NULL。

4

我已经遇到这个问题12小时了,读了大约50篇文章,50个关于此问题的问答,但是我无法解决问题。 我将更加明确地阐述,我希望其他人也能得到解决方案。

问题:我在namech****拥有一个托管账户,并且有一个本地服务器。 在那里使用Linux系统,在我的电脑上使用Xampp Windows系统,但只在我的本地服务器上工作。

test.php:

<?php    
    $data = json_decode(file_get_contents("php://input"), true);
        var_dump($data);
?>

POST请求是:

POST /test.php HTTP/1.1
Host: myweb.io
Content-Type: application/json
Content-Length: 77

{
  "test": "product/created",
  "other": "https://google.com/"
}

我使用REQBIN来测试POST请求。

以下是我的主机返回的响应:

HTTP/1.1 200 OK
Date: Sun, 03 May 2020 17:04:33 GMT
Server: Apache
X-Powered-By: PHP/7.4.5
Content-Encoding: gzip
Vary: Accept-Encoding
Transfer-Encoding: chunked
Content-Type: text/html; charset=UTF-8

NULL

使用XAMPP在我的本地环境中这是正确的响应

HTTP/1.1 200 OK
Date: Sun, 03 May 2020 17:15:19 GMT
Server: Apache/2.4.41 (Win64) OpenSSL/1.1.1c PHP/7.4.3
X-Powered-By: PHP/7.4.3
Content-Length: 94
Content-Type: text/html; charset=UTF-8

Array
(
    [test] => product/created
    [other] => https://google.com/
)

我尝试过的方法:

  • 将allow_url_fopen设置为1或0。
  • 降级PHP版本(尝试了7.1、2、3、4)。
  • 卸载SSL证书
  • 在PHP.INI中进行了许多更改
  • 移除htaccess文件
  • 删除某些php模块/扩展 更新:
  • 该文件是独立的,检查了函数只执行了一次
  • 检查是否存在重定向。(Htaccess、cPanel设置)

2
如果你同时做了几件事情,你就不知道哪一个出了问题。var_dump(file_get_contents("php://input"));会打印什么? - Álvaro González
请看这个链接:https://dev59.com/6GMk5IYBdhLWcg3w5R6k - Salim Ibrohimi
我也建议您不要尝试在Google上找到的随意内容,除非它们包含一个合理的解释,将其与您的问题联系起来。我理解您的沮丧,但这些随意更改很容易破坏事情。 - Álvaro González
1
你丢失POST数据的常见原因可能是环境问题导致的HTTP重定向 - 你确定你的主机上没有发生这种情况吗? - iainn
@iainn 我想我没有重定向。没有htaccess,没有ssl。在cPanel中也没有重定向。 - Amalgama29234
显示剩余8条评论
4个回答

2

我曾经遇到过同样的问题;显然,HTTP重定向(例如301到https)会阻止数据被重定向。

确保没有任何重定向。


1

信不信由你:

将: RewriteRule ^ /%1 [NC,L,R]

改为

RewriteRule ^ %1 [NC,L,R]

然后再改回

RewriteRule ^ /%1 [NC,L,R]

同样地, RewriteRule ^(.*?)/?$ /$1.php [NC,L]

改为

RewriteRule ^(.*?)/?$ $1.php [NC,L]

然后再改回

RewriteRule ^(.*?)/?$ /$1.php [NC,L]

似乎可以解决问题!


0
我修复了它,不知道怎么做的,但我认为解决方案是: 完全删除我的htaccess文件,不进行重定向(从http到https)。 不要使用reqbin进行测试,使用纯php代码或PostMan进行测试。

-1

我也遇到了这个问题,后来发现我的地址是http://而不是https://

现在我使用file_get_contents("php://input")来处理一些事情。

希望这能解决你的问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接