php cURL函数301错误

时间:2014-01-20 12:11:22

标签: php redirect curl

我正在使用此代码:

function getUrl($url) {
if(@function_exists('curl_init')) {
    $cookie = tempnam ("/tmp", "CURLCOOKIE");
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (compatible; CrawlBot/1.0.0)');
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie);
    curl_setopt($ch, CURLOPT_HEADER, true);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT , 5);
    curl_setopt($ch, CURLOPT_TIMEOUT, 5);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
    curl_setopt($ch, CURLOPT_ENCODING, "");
    curl_setopt($ch, CURLOPT_AUTOREFERER, true);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);    # required for https urls
    curl_setopt($ch, CURLOPT_MAXREDIRS, 15);            
    $site = curl_exec($ch);
    curl_close($ch);
    } else {
    global $site;
    $site = file_get_contents($url);
}
return $site;
};

但我看到错误301永久移动。

我该怎么做才能解决这个问题? 你能给我正确的代码吗?

2 个答案:

答案 0 :(得分:9)

  在CURLOPT_FOLLOWLOCATION或者safe_mode中无法激活

open_basedir   safe_mode = Off已设置

你可以试试这个:

解决方案1:

php.ini文件中设置/etc/(通常位于服务器上的open_basedir)。如果已经关闭,请查看php.ini文件中的<?php function geturl($url){ (function_exists('curl_init')) ? '' : die('cURL Must be installed for geturl function to work. Ask your host to enable it or uncomment extension=php_curl.dll in php.ini'); $cookie = tempnam ("/tmp", "CURLCOOKIE"); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (compatible; CrawlBot/1.0.0)'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie); curl_setopt($ch, CURLOPT_HEADER, true); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT , 5); curl_setopt($ch, CURLOPT_TIMEOUT, 5); //curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); curl_setopt($ch, CURLOPT_ENCODING, ""); curl_setopt($ch, CURLOPT_AUTOREFERER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); # required for https urls curl_setopt($ch, CURLOPT_MAXREDIRS, 15); $html = curl_exec($curl); $status = curl_getinfo($curl); curl_close($curl); if($status['http_code']!=200){ if($status['http_code'] == 301 || $status['http_code'] == 302) { list($header) = explode("\r\n\r\n", $html, 2); $matches = array(); preg_match("/(Location:|URI:)[^(\n)]*/", $header, $matches); $url = trim(str_replace($matches[1],"",$matches[0])); $url_parsed = parse_url($url); return (isset($url_parsed))? geturl($url):''; } } return $html; } ?> 内容并注释该行(#open_basedir ...)。重启apache服务器。

解决方案2:
如果以上不起作用(它应该!)试试这个:

{{1}}

答案 1 :(得分:5)

您可能需要使用location header标志启用以下重定向:

curl -L <URL>