PHP;通过浏览器与CLI进行访问时,cURL的行为有所不同

时间:2019-01-25 21:13:02

标签: php curl cloudflare

我有一个服务器应用程序,它将通过CLI在后台运行一些长时间运行的PHP脚本。其中之一是一个简单的蜘蛛,它将浏览网站列表并使用cURL获取其内容。

当起作用的功能是浏览器访问的页面的一部分时,它可以正常工作。当我将工作拖到在CLI中运行的PHP脚本时,cloudflare后面的站点将失败,提示“请启用cookie”。然后详细说明我被阻止了。

这是PHP函数:

static function getPage($url, $timeout = 5)
{
    $agent= 'Mozilla/5.0 (compatible; SimpleSpiderBot/0.1; +'.url('/').')';
    $ch = curl_init();

    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_VERBOSE, true);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_USERAGENT, $agent);
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);

    $html = @curl_exec($ch);
    curl_close($ch);
    return $html;
}

让我感到困惑的是,PHP所做的工作都是一样的,只是PHP环境(CLI与Apache请求)不同。我尝试将PHP CLI命令设置为使用与页面相同的PHP.ini文件,但该文件无效。

编辑:添加了Cookie处理代码,但是当该代码无法解决问题时,为了清楚起见,我删除了多余的代码。

2 个答案:

答案 0 :(得分:0)

问题在于CloudFlare将尝试验证请求的多个方面,但不一定表示“格式错误”。在这种情况下,我编写的url()函数在后台运行时返回“ /”,而不是浏览器中的完整URL(例如“ example.com/”)。这意味着用户代理将读取“ Mozilla / 5.0(兼容; SimpleSpiderBot / 0.1; /)”,Cloudflare显然不喜欢。

我对陷入这一问题的开发人员的建议是彻底检查每个标头和选项,以查看Cloudflare是否对内容感到“挑剔”,因为即使是轻微的“格式错误”也会阻止请求。

答案 1 :(得分:-1)

我想不出任何原因来使您的Web服务器成功,但在Cookie方面CLI却失败了。根据haxx.se(我相信它是curl的官方网站,curl does not handle cookies unless you explicitly tell it to)所述。我相信您在上方的脚本默认情况下根本不会费心处理cookie。如果该站点要求使用cookie,则您将获得任何正确的行为,这表明您已忽略了某些内容或问题出在其他地方

请注意,您可以将curl请求设置为接受Cookie as described here