php.net中关于url的所有示例都只使用http而非https进行了演示。我真的不明白为什么用https没有证明这一点。 file_get_contents对于http URL返回true,对于https返回false URL。
true
返回。代码:
function connectMe() {
$urlHeader = $_REQUEST['urlHeader'];
// if this is a http url it's working for file_get_contents returns true
// if this is a https url it's not working file_get_contents gives false
$status = send($urlHeader);
var_dump($status);
echo $status ? 'success' : 'failed';
exit;
}
function send($url) {
$ctx = stream_context_create(
array(
'http'=>array(
'header'=>"Content-type: application/x-www-form-urlencoded",
'method'=>'POST',
'content'=>NULL
)
)
);
var_dump(stream_get_wrappers());
$w = stream_get_wrappers();
echo 'openssl: ', extension_loaded ('openssl') ? 'yes':'no', "\n";
echo 'http wrapper: ', in_array('http', $w) ? 'yes':'no', "\n";
echo 'https wrapper: ', in_array('https', $w) ? 'yes':'no', "\n";
echo 'wrappers: ', var_export($w);
return file_get_contents($url, 0, $ctx);
}
注意:
1.上面的代码已根据stackoverflow中给出的解决方案进行了集成,其中结果中没有任何变化。
2. openssl
已启用且allow_url_fopen
已启用。
我得到的输出:
array(9){[0] => string(5)" https" [1] => string(4)" ftps" [2] => string(3)" php" [3] => string(4)" file" [4] => string(4)" glob" [5] => string(4)" data" [6] => string(4)" http" [7] => string(3)" ftp" [8] => string(4)" phar" }
openssl:是http包装器:是https包装器:是包装器:数组(0 =>' https',1 =>' ftps',2 =>&# 39; php',3 =>' file',4 =>' glob',5 =>'数据',6 => ' http',7 =>' ftp',8 =>' phar',)
警告:file_get_contents():php_network_getaddresses:gethostbyname失败。第40行的FILENAME.PHP中的errno = 0
警告:file_get_contents(https://someIPhere或网站):无法打开流:php_network_getaddresses:gethostbyname失败。第40行的FILENAME.PHP中的errno = 0
布尔(假)失败
答案 0 :(得分:0)
您可能会指向自签名的ssl。如果是这样,那可能就是原因。检查以确保URL具有有效的SSL证书。
如果您想绕过SSL验证,则需要添加stream_context_create来设置' verify_peer' =>假的。
请参阅: file_get_contents(): SSL operation failed with code 1 (certificate verify failed)