如何使file_get_contents('php://input')支持HTTP和HTTPS


how to make file_get_contents('php://input') support for http and https

如何使file_get_contents('php://input')支持http和https,以便来自http或https的任何请求都可以毫无问题地得到处理?

在服务器上,我添加了重定向以将用户从http重定向到https。目前,我们的网站应用程序指向HTTP,下一个版本的应用程序将连接到HTTPS。我必须回馈对两个版本的 Web 服务的支持。

我正在使用 file_get_contents('php://input'( 从应用程序的请求中获取变量,它适用于除 JSON 请求以外的所有请求。

我用谷歌搜索了很多,找到了以下解决方案,但它也不起作用。

$opts = array('http' =>
    array(
        'follow_location' => 1,
    )
);
$context = stream_context_create($opts);
$result = file_get_contents('http://example.com/', false, $context);

也尝试了相同的

$result = file_get_contents('php://input', false, $context);

您正在尝试读取传入请求的请求正文,这意味着 POST 或 PUT 请求。但是,您还会将此请求重定向到另一个 URL。您不能重定向 POST/PUT 请求,它们在重定向时将始终成为 GET 请求,并且不会转发请求正文。

  1. 客户端→服务器:POST /foo { lots of data }
  2. 客户端←服务器:谢谢,请看这里:302 Found Location: /bar
  3. 客户端→服务器:GET /bar(看妈,没有数据!

您的问题不是 PHP 无法读取php://input如果请求是 HTTPS,您的问题是根本没有请求正文可以读取,因为您重定向了请求并在此过程中丢弃了正文。

客户端必须自行向正确的 URL(HTTP 或 HTTPS(发出请求,您需要在第一次尝试时处理请求而不进行重定向。

我知道

,您正在将选定的请求从http重定向到https很可能是通过.htaccess规则。应该在特定时间使用 http 或 https 协议。

这意味着您的脚本应该通过 file_get_contents(( 函数发出请求,其协议与调用的协议相同。因此,没有必要"跟随位置"。

以下代码将从其自己的请求中获取协议,并将其用于辅助请求:

<?php
// Find out the protocol we were called
$encrypted = ((isset($_SERVER["HTTPS"])) && (strtoupper($_SERVER["HTTPS"]) == 'ON'));
$proto = ($encrypted) ? "https://" : "http://";
$opts = array(
    'http'=>array(
        'method'=>"GET",
    )
);
$context = stream_context_create($opts);
// Open a file with the headers defined.
// Use the same protocol as we were called
$file = file_get_contents($proto . 'www.example.com/path/test.php', false, $context);
echo "<pre>$file</pre>";