Php 卷曲-罐';t获取页面内容和/或在该页面上发布数据

Php 卷曲-罐';t获取页面内容和/或在该页面上发布数据,php,curl,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;

我试图使用
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:(

这是我在打印时得到的信息。
print\r
curl\u getinfo()


谢谢!

这是一个技术性强于实用性的回答,但我将解释这里发生了什么,以及为什么cURL无法获取请求的网页

请注意,这似乎是一种边缘情况。它可能在您的系统上工作,而在其他系统上不工作。有关详细信息,请参阅


发生了什么事?
要查看进行cURL调用时发生的情况,应启用
CURLOPT\u 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
由此我们可以得出结论,在cURL的CA信任库中找不到用于颁发网站TLS证书的证书(位于本系统上的
/etc/ssl/certs/CA certificates.crt

现在有人可能想知道为什么会出现这种情况。正因为如此,才为该网站颁发了证书。该网站使用了RapidSSL TLS证书,该证书在2017年12月1日之前颁发。这意味着它属于旧RapidSSL证书的不信任部分


如何解决这个问题?
嗯,你不能真的做任何事情。网站所有者应该更新他们的TLS证书。他们应该真的这么做,因为Chrome很快就会开始抛出严重错误。(错误应该已经出现在M70测试版中。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握手以建立与网站的安全连接。这一切都是由于


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

这是一个技术性强于实用性的答案,但我将解释这里发生了什么,以及为什么cURL无法获取请求的网页

请注意,这似乎是一种边缘情况。它可能在您的系统上工作,而在其他系统上不工作。有关详细信息,请参阅


发生了什么事?
要查看进行cURL调用时发生的情况,应启用
CURLOPT\u 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
由此我们可以得出结论,在cURL的CA信任库中找不到用于颁发网站TLS证书的证书(位于本系统上的
/etc/ssl/certs/CA certificates.crt

现在有人可能想知道为什么会出现这种情况。正因为如此,才为该网站颁发了证书。该网站使用了RapidSSL TLS证书,该证书在2017年12月1日之前颁发。这意味着它属于旧RapidSSL证书的不信任部分


如何解决这个问题?
嗯,你不能真的做任何事情。网站所有者应该更新他们的TLS证书。他们应该真的这么做,因为Chrome很快就会开始抛出严重错误。(错误应该已经出现在M70测试版中。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握手以建立与网站的安全连接。这一切都是由于


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

您请求返回的页面应该返回什么?嘿@TomUdding,该页面应该返回一个登录表单(稍后我想发布一些字段以使用curl登录-我已经尝试登录,但我得到了相同的空白页面:()您是否尝试过删除所有与gzip相关的代码,只使用
curl\u setopt($ch,CURLOPT\u ENCODING,”);
?@TomUdding我现在尝试过,但仍然没有效果-我可以与您共享url以便您可以查看吗?pleeese:-是的。只是为了确保,您想要整个页面,对吗?它的HTML部分,可能是获取表单中输入的名称属性。您请求返回的页面应该是什么?嘿@TomUdding,该页面应该返回一个登录表单(稍后我想发布一些字段以使用curl登录-我已经尝试登录,但我得到了相同的空白页面:()您是否尝试过删除所有与gzip相关的代码,只使用
curl\u setopt($ch,CURLOPT\u ENCODING,”);
?@TomUdding我现在尝试过,但仍然没有效果-我可以与您共享url以便您可以查看吗?pleeese:-是的。只是为了确保,您想要整个页面,对吗?它的HTML部分,可能是获取表单中输入的名称属性。Tommmmm您救了我的命@emma证书存在是有原因的。它们确保您发送和接收的所有内容都经过加密,从而防止所谓的“中间人”攻击。在这种攻击中,恶意方可能会在您收到内容之前修改内容。Troy Hunt(a