【问题标题】:Get cURL to follow redirects获取 cURL 以跟踪重定向
【发布时间】:2015-12-07 23:02:47
【问题描述】:

我在 Laravel 中有一个应用程序,可以抓取网站并检索特定信息。 最近我看到越来越多的网站被 403 禁止,所以我决定第一次尝试 cURL。

我现在唯一的问题是,有 301 或 302 重定向的网站,cURL 不跟随它们。

这就是我所拥有的:

$curl = curl_init(); 
        curl_setopt($curl, CURLOPT_URL, $results['url_search']);  
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);  
        curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 10);  
        curl_setopt($curl,CURLOPT_USERAGENT,'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13');

        $str = curl_exec($curl);  

        $header_size = curl_getinfo($curl, CURLINFO_HEADER_SIZE);
        $header = curl_getinfo($curl, CURLINFO_HTTP_CODE);
        $body = substr($str, $header_size);

        curl_close($curl); 

正如我所说,在有重定向的页面上,我被卡住了。有什么建议? 我见过一些东西,但没有一个有效。

【问题讨论】:

  • 你可以解析头部,然后再发出一个 curl 请求。
  • 但是我如何获得实际的标头响应?我所拥有的 ($header = curl_getinfo($curl, CURLINFO_HTTP_CODE);) 只是在解析后给了我数字。我可以以某种方式使用 get_headers 吗?

标签: php curl http-redirect


【解决方案1】:

curl 有一个选项可以准确地实现您正在寻找的东西, 以下重定向:

curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);

只需在执行之前将此行添加到您的 curl-options 中即可。

如您所料,这将遵循任何 301 / 302 重定向并最终到达一个站点,该站点不会进一步重定向您的请求。

另外,请记住(没有解决方法)这可能会导致无限循环。 (站点 a 重定向到 b,b 重定向到 a)。

也就是说,您也应该使用此选项:

curl_setopt($curl, CURLOPT_MAXREDIRS, 10);

这样,您的请求将在 10 次重定向后结束,您不必担心脚本在无限循环中运行。

php.net 上的相关网站是您进一步使用不同选项的好来源

【讨论】:

  • 感谢@DasSaffe,这正是我想要的,它就像一个魅力!
猜你喜欢
  • 1970-01-01
  • 2012-01-30
  • 2011-05-26
  • 1970-01-01
  • 1970-01-01
  • 2012-05-04
  • 1970-01-01
  • 1970-01-01
  • 2014-04-13
相关资源
最近更新 更多