Curl无法获取重定向页面内容的问题求助
解决PHP cURL仅返回响应头无HTML内容的问题
你的问题核心是cURL请求被服务器识别为非浏览器请求,或未正确处理响应格式,导致仅返回响应头而没有实际HTML内容。以下是针对性修复方案:
关键问题分析
- 缺少浏览器标识:受Cloudflare防护的站点通常会拦截默认cURL的请求——它的User-Agent是
curl/xxx,极易被识别为爬虫。 - 未处理响应压缩:响应头包含
vary: Accept-Encoding,说明服务器可能返回gzip压缩内容,但你的代码未开启自动解压缩,导致获取到的是二进制压缩数据,stripos无法匹配<body>。 - header_size分割不可靠:启用
CURLOPT_FOLLOWLOCATION时,curl_getinfo返回的header_size仅对应最后一次重定向的响应头,但CURLOPT_HEADER=true会包含所有重定向的头信息,导致分割位置错误,拿到的内容为空。 - 无错误检测机制:代码未检查cURL执行过程中的错误,可能请求已失败但未被发现。
修复后的代码
<?php // 创建cURL资源 $ch = curl_init(); // 设置目标URL $url = "https://www.datanumen.com/ko/blogs/blogs/sql-server-database-mirroring-technique-advantages-disadvantages/"; curl_setopt($ch, CURLOPT_URL, $url); // 核心配置 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); // 模拟浏览器User-Agent,避免被拦截 curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36'); // 自动处理gzip/deflate压缩响应 curl_setopt($ch, CURLOPT_ENCODING, ''); // 本地环境临时禁用SSL验证(生产环境建议配置证书后关闭此选项) curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); // 单独收集响应头,避免与内容混淆 $headers = []; curl_setopt($ch, CURLOPT_HEADERFUNCTION, function($ch, $header) use (&$headers) { $len = strlen($header); $header = trim($header); if (!empty($header)) { $headers[] = $header; } return $len; }); $retry_count = 2; $has_valid_contents = false; do { // 执行请求 $html = curl_exec($ch); $response_info = curl_getinfo($ch); // 检查cURL执行错误 if (curl_errno($ch)) { $error_msg = curl_error($ch); file_put_contents(dirname(__FILE__).'/logs.txt', 'cURL错误: '.$error_msg.PHP_EOL, FILE_APPEND); $retry_count--; continue; } // 验证HTTP状态码 if ($response_info['http_code'] !== 200) { file_put_contents(dirname(__FILE__).'/logs.txt', 'HTTP状态码异常: '.$response_info['http_code'].PHP_EOL, FILE_APPEND); $retry_count--; continue; } // 验证内容有效性 $has_valid_contents = (stripos($html, '<body') !== false); if ($has_valid_contents) { file_put_contents(dirname(__FILE__).'/logs.txt', 'valid content'.PHP_EOL, FILE_APPEND); } else { file_put_contents(dirname(__FILE__).'/logs.txt', 'invalid content'.PHP_EOL, FILE_APPEND); // 记录内容长度辅助排查 file_put_contents(dirname(__FILE__).'/logs.txt', '内容长度: '.strlen($html).PHP_EOL, FILE_APPEND); } $retry_count--; } while (($retry_count > 0) && !$has_valid_contents); // 释放cURL资源 curl_close($ch); ?>
修复要点说明
- 模拟浏览器请求:添加真实浏览器的User-Agent,绕过服务器的爬虫检测。
- 自动处理压缩:
CURLOPT_ENCODING=''让cURL自动解析gzip/deflate格式的响应,确保拿到可解析的HTML文本。 - 分离头与内容:使用
CURLOPT_HEADERFUNCTION回调单独收集响应头,彻底解决header_size分割不准确的问题。 - 增加错误排查:添加cURL错误检测和HTTP状态码验证,快速定位请求失败原因。
- SSL兼容性处理:针对本地环境临时禁用SSL证书验证,生产环境需配置正规证书后关闭此选项。
内容的提问来源于stack exchange,提问作者alancc
相关产品推荐
相关产品推荐

