file_get_contents 来自远程客户端和 SSL

file_get_contents from remote client and SSL

我有 PHP Laravel5 项目。我在控制器的操作中使用 file_get_contents(),如下所示:

$production = json_decode(file_get_contents(url('/operation/get-production/'.$job->id)))->production;

以上路由被排除在身份验证和授权之外,以上代码行在本地主机中运行良好。但是,当来自 Internet 的远程用户使用该代码时,它会生成以下错误:

我没有使用 IIS,服务器是 Ubuntu linux 上的 Apache。我不知道为什么会在这种情况下出现SSL?我很确定提供给函数的 URL 是 http://... 而不是 https://...

听起来证书验证失败,因为它没有根证书的参考文件来检查它。参见 this Stack Overflow answer

您的作品 URL 可能被迫使用 https(这是件好事)。

file_get_contents() 不是通过 https 获取数据的完美选择,但是如果 php_openssl 扩展被激活并且 allow_url_fopen 设置为 "on" 你可以得到内容来自 https.

因为您似乎没有有效的 SSL 证书:使用 PHP Curl 一定是个更好的主意 (http://php.net/manual/fr/book.curl.php),因为您可以通过此禁用 SSL 错误:

curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);

(如果您信任 URL:您可以这样做,永远不要对外部网站这样做)

您有两种可能的情况:

可能的答案 #1,如果您使用的是 apache,请检查您的 conf,看看您的域是否没有强制所有调用都使用 SSL

  • 或-

可能的答案 #2 您需要为 GET url 创建一个流程并将 headers 发送到其他服务器:

<?php //Create a flow 
$opt = array(
'http'=>array(
'method'=>'GET',
'user_agent' => 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7) Gecko/20040803 Firefox/0.9.3',
'header'=>'Accept-language: en\r\n' .
                 'Cookie: foo=bar\r\n’ ) ); 
$context = stream_context_create($opt); 
//Get external url response
$file = file_get_contents('http://www.example.com/some_file', false, $context); ?>