You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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);
?>

修复要点说明

  1. 模拟浏览器请求:添加真实浏览器的User-Agent,绕过服务器的爬虫检测。
  2. 自动处理压缩:CURLOPT_ENCODING=''让cURL自动解析gzip/deflate格式的响应,确保拿到可解析的HTML文本。
  3. 分离头与内容:使用CURLOPT_HEADERFUNCTION回调单独收集响应头,彻底解决header_size分割不准确的问题。
  4. 增加错误排查:添加cURL错误检测和HTTP状态码验证,快速定位请求失败原因。
  5. SSL兼容性处理:针对本地环境临时禁用SSL证书验证,生产环境需配置正规证书后关闭此选项。

内容的提问来源于stack exchange,提问作者alancc

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 12:50:13