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

CURLOPT_FOLLOWLOCATION失效,抓取重定向网站页面为空求助

嘿,我来帮你解决这个cURL抓取重定向的问题!结合你提到的情况,我分两种常见的重定向场景给你解决方案:

一、处理HTTP头层面的3xx重定向

很多网站会用HTTP 301/302这类状态码做重定向,但默认情况下cURL并不会自动跟随这些重定向,这是导致你抓取失败的常见原因。你只需要给cURL添加跟随重定向的配置即可:

  • 开启自动跟随:curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);,默认最多跟随50次重定向
  • 可选:自定义最大重定向次数,比如限制为10次:curl_setopt($ch, CURLOPT_MAXREDIRS, 10);

给你一个完整的示例代码:

// 初始化cURL会话
$ch = curl_init('https://你要抓取的目标网站');
// 设置返回内容不直接输出,而是存到变量里
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// 开启自动跟随重定向
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
// 可选:设置最大重定向次数
curl_setopt($ch, CURLOPT_MAXREDIRS, 10);
// 可选:如果是HTTPS网站,临时跳过证书验证(仅测试用,生产环境建议保留验证)
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
// 可选:模拟浏览器User-Agent,避免被网站拦截
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36');

// 执行抓取
$content = curl_exec($ch);
// 检查是否有错误
if(curl_errno($ch)){
    echo 'cURL执行出错:' . curl_error($ch);
}
// 关闭会话
curl_close($ch);

// 输出抓取到的内容
echo $content;
二、处理JS/HTML Meta倒计时重定向(就是你贴的那种20秒倒计时跳转)

你提供的代码是JS触发的倒计时跳转,这种不属于HTTP头重定向,cURL本身不会解析JS,所以得手动提取跳转目标再抓取:

  1. 先抓取带倒计时的页面内容
  2. 从内容里提取最终的跳转URL(可能在JS或者meta标签里)
  3. 用cURL抓取这个目标URL

比如针对你贴的JS倒计时场景,提取跳转URL的示例代码:

// 先抓取带倒计时的页面
$ch = curl_init('https://带倒计时的目标网站');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36');
$pageContent = curl_exec($ch);
curl_close($ch);

// 用正则提取JS里的跳转URL(根据目标网站的JS代码调整正则)
preg_match('/window\.location\.href\s*=\s*["\'](.*?)["\']/i', $pageContent, $matches);
if(isset($matches[1])){
    $targetUrl = $matches[1];
    // 再抓取最终的目标URL
    $ch2 = curl_init($targetUrl);
    curl_setopt($ch2, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch2, CURLOPT_FOLLOWLOCATION, true);
    $finalContent = curl_exec($ch2);
    curl_close($ch2);
    echo $finalContent;
}else{
    echo '未能从页面中提取到跳转目标地址';
}

小提示:如果网站是用meta标签做倒计时跳转(比如<meta http-equiv="refresh" content="20; url=目标地址">),可以把正则换成:preg_match('/meta.*?content\s*=\s*["\']\d+;\s*url=(.*?)["\']/i', $pageContent, $matches)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:02:35