PHP使用Curl发起GET请求出现SSL证书错误、301跳转问题如何解决
问题原因说明
你遇到的两个问题分别对应cURL的默认配置限制:
- SSL报错是因为PHP cURL默认会验证目标站点的SSL证书合法性,你本地环境没有配置根CA证书包所以验证失败;Python requests库自带了CA证书包,默认可以正常完成验证,所以不会报错。
- 301跳转无响应是因为cURL默认不会自动跟随301/302重定向响应,需要手动开启对应配置。
解决方案
1. 处理SSL证书报错
临时调试方案(仅本地测试用,生产环境禁用)
直接跳过SSL证书验证,在你的curl配置段添加两行参数:
// 跳过证书主体验证 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 跳过证书主机名验证 curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
生产环境正规方案
在本地配置合法的CA证书包即可:
- 下载cURL官方提供的通用根CA证书包
cacert.pem,保存到本地PHP安装目录的extras/ssl路径下 - 打开
php.ini配置文件,找到[curl]配置段,添加如下配置(替换为你自己的证书实际存放路径):
curl.cainfo = "C:\php\extras\ssl\cacert.pem"
- 重启你的Web服务(Apache/Nginx/PHP-FPM)后配置生效,无需关闭SSL验证即可正常发起请求。
2. 处理301跳转问题
添加自动跟随重定向的配置即可:
// 开启自动跟随重定向 curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); // 最大重定向次数,防止死循环 curl_setopt($ch, CURLOPT_MAXREDIRS, 10);
修改后完整可运行代码
<?php $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, 'https://www.instagram.com/majhcc/?__a=1'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET'); // 新增:重定向配置 curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); curl_setopt($ch, CURLOPT_MAXREDIRS, 10); // 新增:SSL配置(如果用正式CA证书方案可以删掉下面两行) curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($ch, CURLOPT_ENCODING, 'gzip, deflate'); $headers = array(); $headers[] = 'Authority: www.instagram.com'; $headers[] = 'Cache-Control: max-age=0'; $headers[] = 'Sec-Ch-Ua: "Microsoft Edge";v="93", " Not;A Brand";v="99", "Chromium";v="93"'; $headers[] = 'Sec-Ch-Ua-Mobile: ?1'; $headers[] = 'Sec-Ch-Ua-Platform: "Android"'; $headers[] = 'Dnt: 1'; $headers[] = 'Upgrade-Insecure-Requests: 1'; $headers[] = 'User-Agent: Mozilla/5.0 (Linux; Android 6.0.1; Moto G (4)) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Mobile Safari/537.36 Edg/93.0.961.52'; $headers[] = 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9'; $headers[] = 'Sec-Fetch-Site: none'; $headers[] = 'Sec-Fetch-Mode: navigate'; $headers[] = 'Sec-Fetch-User: ?1'; $headers[] = 'Sec-Fetch-Dest: document'; $headers[] = 'Accept-Language: en-US,en;q=0.9,ar;q=0.8,mt;q=0.7'; $headers[] = 'Sec-Gpc: 1'; curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); $result = curl_exec($ch); if (curl_errno($ch)) { echo 'Error:' . curl_error($ch); } curl_close($ch); echo $result;
内容的提问来源于stack exchange,提问作者Mohammed
相关产品推荐
相关产品推荐

