使用fabpot/goutte 3.2因SSL问题无法访问网站求助
解决Goutte 3.2访问网站时的SSL问题
我之前也碰到过类似的SSL连接坑,结合Goutte 3.2的依赖特性(它基于Guzzle 6+),给你几个针对性的解决思路:
1. 补全请求URL的协议头
你当前的请求URL是"www.superpharm.pl/sklepy",缺少https://协议前缀。Goutte在处理这类无协议URL时,很可能会解析错误,直接导致SSL握手流程异常。先把URL修正为:
$crawler = $client->request('GET', "https://www.superpharm.pl/sklepy");
2. 调整Guzzle的SSL配置方式
Guzzle 6+之后更推荐用自身的配置选项,而非直接传递curl数组,这样配置更稳定且符合框架规范。你可以替换原有的Guzzle初始化代码:
$guzzleClient = new \GuzzleHttp\Client([ 'allow_redirects' => true, // 替代CURLOPT_FOLLOWLOCATION 'verify' => false, // 一次性禁用SSL_VERIFYHOST和SSL_VERIFYPEER ]);
注意:生产环境里别长期开
verify => false,这会降低安全性。如果可行,建议把目标网站的CA证书导入本地,然后将verify设置为证书文件的路径。
3. 指定TLS版本(可选)
有些网站会限制仅支持TLS 1.2或更高版本,你可以通过curl选项强制指定TLS版本:
$guzzleClient = new \GuzzleHttp\Client([ 'allow_redirects' => true, 'verify' => false, 'curl' => [ CURLOPT_SSLVERSION => CURL_SSLVERSION_TLSv1_2, // 强制使用TLS 1.2 ], ]);
修改后的完整代码
$client = new \Goutte\Client(); $guzzleClient = new \GuzzleHttp\Client([ 'allow_redirects' => true, 'verify' => false, 'curl' => [ CURLOPT_SSLVERSION => CURL_SSLVERSION_TLSv1_2, ], ]); $client->setClient($guzzleClient); $crawler = $client->request('GET', "https://www.superpharm.pl/sklepy"); $crawler->filter('body')->each(function ($node) { print $node->text() . "\n"; });
先试试上面的方案,大部分SSL连接问题都能通过这些步骤解决。
内容的提问来源于stack exchange,提问作者Cristian Gonzalez
相关产品推荐
相关产品推荐

