2014-01-20 4 views
5

Я использую этот код:PHP CURL функция 301 ошибка

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 Moved постоянно.

Что я могу сделать, чтобы решить эту проблему? Можете ли вы дать мне правильный код, пожалуйста?

+0

Похоже, сервер не предоставляет WHERE, куда перемещено местоположение, поэтому ваш curl не имеет URL-адреса для FOLLOWLOCATION. Вы ничего не можете сделать, и ваш код верен. – DanFromGermany

+0

http://stackoverflow.com/questions/14054652/getting-301-with-curl-despite-followlocation вы видели это? –

+0

@ kk12391 да, как мне изменить свой код? – user3214712

ответ

9

CURLOPT_FOLLOWLOCATION не может быть активирована, когда в safe_mode или open_basedir установлен

Вы можете попробовать это:

Решение 1:

Set safe_mode = Off в файле php.ini (обычно в /etc/ на месте RVer). Если это уже отключено, просмотрите файл open_basedir в файле php.ini и прокомментируйте эту строку (#open_basedir ...). Перезапустите сервер Apache.

Решение 2:
Если выше не работает (! Это нужно) попробовать это:

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

?> 
+1

спасибо, но он все еще не работает! – user3214712

+0

какой из шагов вы сделали? –

+0

Я заменил код. и я открыл свой php-файл (crawler.php), а затем вижу белую страницу :) – user3214712

5

Вам может понадобиться для того, чтобы отслеживать перенаправления с помощью флага заголовка местоположение:

curl -L <URL>

Смежные вопросы