我试图在Ubuntu 15.10上使用PHP中的curl获取HTML页面。
我的代码是以下..
<?php
ini_set('display_errors', 1);
$url = 'http://www.galliera.it/118';
print "The url ... ".$url;
echo '<br>';
echo '<br>';
//#Set CURL parameters ...
$ch = curl_init();
curl_setopt($ch, CURLOPT_AUTOREFERER, TRUE);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
curl_setopt($ch, CURLOPT_PROXY, '');
$data = curl_exec($ch);
curl_close($ch);
print "Data ... ".$data;
echo '<br>';
echo '<br>';
?>
我执行代码时无法显示$data
值,而在我的控制台中,返回的执行代码为200.
任何帮助/建议/示例?
答案 0 :(得分:1)
您需要使用SSL设置curl
如果CURLOPT_SSL_VERIFYPEER为真(它应该是!),你需要告诉curl使用CURLOPT_CAINFO和CURLOPT_CAPATH(certificates)查找documentation的位置。
所有使用SSL的浏览器都必须拥有不同Certificate Authorities的本地公钥集合,以便他们可以建立对网站安全连接的信任链。此列表需要定期更新,因为证书过期并被替换,受到攻击,无法信任或添加新的列表。网站https://curl.haxx.se/有一个从Mozilla中提取的cacert.pem文件。
获取最新副本的推荐方法是定期从该网站下载,但不要经常下载其服务器。每个月应该足够了。
在Linux上,您可以使用crontab这样的条目:
# update CA cert store every month
0 1 1 * * curl --remote-name --time-cond /path/to/cacert.pem https://curl.haxx.se/ca/cacert.pem
url 302无论如何都会重定向到https版本,所以它应该是https并保存了网络往返。
$url = 'https://www.galliera.it/118';
$ch = curl_init();
$opt = array(
CURLOPT_AUTOREFERER => true,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HEADER => false,
CURLOPT_URL => $url,
CURLOPT_SSL_VERIFYHOST => 2, //match common name in cert
CURLOPT_SSL_VERIFYPEER => true,
CURLOPT_ENCODING => '', //enable gzip
CURLOPT_CAINFO => '/path/to/cacert.pem', //CA cert store !!!
// if you are using linux and have openssl installed:
CURLOPT_CAPATH => '/etc/ssl/certs',
// you only need this when actually using a proxy
// curl_setopt($ch, CURLOPT_PROXY, '');
);
curl_setopt_array($ch, $opt);
$data = curl_exec($ch);
curl_close($ch);
echo $data;
使用CURLOPT_PROXY指定代理ip:端口,但是如果你没有使用它,那就不要在那里。