卷曲-无法获取页面的内容和/或在该页面上发布数据

时间:2018-09-19 17:36:05

标签: php curl

我正在尝试使用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
)

谢谢!

1 个答案:

答案 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造成的。

请再次(请注意),永远不要禁用安全检查。