如何使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 请求,并且不会转发请求正文。
- 客户端→服务器:
POST /foo { lots of data }
- 客户端←服务器:谢谢,请看这里:
302 Found Location: /bar
- 客户端→服务器:
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>";