我正在尝试使用curl
获取一个网页,但是我只得到一个空白页面,没有输出。这是我正在尝试的方法:
curl_setopt($ch, CURLOPT_URL, 'https://example.com/b2b/');
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_MAXREDIRS, 2);
curl_setopt($ch, CURLOPT_USERAGENT,"Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:31.0) Gecko/20100101 Firefox/31.0 " );
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
经过一番研究,我尝试将其添加为:
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Accept-Encoding: gzip'));
这也是我在添加最后一行后试图将其回显的方式:
$response = curl_exec($ch);
$content = @gzdecode($response);
echo ($content !== false) ? $content : $response;
我做错什么了吗?我的意思是,如果我用另一个网站的URL更改URL :(。
P.S这就是我print_r
curl_getinfo()
所得到的:
Array
(
[url] => https://example.com/b2b/
[content_type] =>
[http_code] => 0
[header_size] => 0
[request_size] => 0
[filetime] => -1
[ssl_verify_result] => 0
[redirect_count] => 0
[total_time] => 0
[namelookup_time] => 0
[connect_time] => 0
[pretransfer_time] => 0
[size_upload] => 0
[size_download] => 0
[speed_download] => 0
[speed_upload] => 0
[download_content_length] => -1
[upload_content_length] => -1
[starttransfer_time] => 0
[redirect_time] => 0
[redirect_url] =>
[primary_ip] =>
[certinfo] => Array
(
)
[primary_port] => 0
[local_ip] =>
[local_port] => 0
)
谢谢!
答案 0 :(得分:2)
这是比实际答案更具技术性的答案,但我将在此说明发生了什么以及为什么cURL无法获取所请求的网页。
请注意,这似乎是个极端情况。它可能在您的系统上运行,而在其他系统上不运行。有关更多信息,请参见Symantec PKI Distrust。
发生了什么事?
要查看在进行cURL调用时发生了什么错误,应启用CURLOPT_VERBOSE
日志记录:
* Hostname [REDACTED] was found in DNS cache
* Trying [REDACTED]...
* TCP_NODELAY set
* Connected to [REDACTED] ([REDACTED]) port 443 (#0)
* ALPN, offering http/1.1
* successfully set certificate verify locations:
* CAfile: /etc/ssl/certs/ca-certificates.crt
CApath: /etc/ssl/certs
* SSL certificate problem: unable to get local issuer certificate
* stopped the pause stream!
* Closing connection 0
由此我们可以得出结论,用于发布网站TLS证书的证书无法在cURL的CA信任库中找到(位于此系统上的/etc/ssl/certs/ca-certificates.crt
中)。
现在人们可能会奇怪为什么会这样。嗯,这是因为the distrust of the CA certificate颁发了该网站的证书。该网站使用RapidSSL TLS证书,该证书在2017年12月1日之前颁发。这意味着它会与旧的RapidSSL证书的不信任部分同时存在。
该如何解决?
好吧,你真的什么也做不了。网站所有者有权更新其TLS证书。他们确实应该这样做,因为Chrome很快就会开始引发严重的错误。 (M70 Beta版本中应该已经出现了错误。10月16日之后,所有版本[> M70]都会引发严重的错误。)
除了可以绕过cURL中的SSL / TLS证书检查之外。
我不建议您这样做,您切勿禁用证书检查!
您可以使用
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
以禁用检查,然后cURL将返回网页:
<?php
$url = "https://[REDACTED]";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); // one should never do this
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); // or this!!!
$output = curl_exec($ch);
curl_close($ch);
echo $output;
// all kinds of HTML and other things
?>
结论
所请求的网站使用的证书将被拒绝/已经被信任,因此cURL无法完成TLS握手来建立与该网站的安全连接。这都是由于Distrust of the Symantec PKI造成的。
请再次(请注意),永远不要禁用安全检查。