2011-12-30 1 views
5

Я создал следующую PHP-функцию для HTTP-кода веб-страницы.PHP CURL следует перенаправить для получения статуса HTTP

function get_link_status($url, $timeout = 10) 
{ 
    $ch = curl_init(); 

    // set cURL options 
    $opts = array(CURLOPT_RETURNTRANSFER => true, // do not output to browser 
       CURLOPT_URL => $url,   // set URL 
       CURLOPT_NOBODY => true,   // do a HEAD request only 
       CURLOPT_TIMEOUT => $timeout); // set timeout 
    curl_setopt_array($ch, $opts); 

    curl_exec($ch); // do it! 

    $status = curl_getinfo($ch, CURLINFO_HTTP_CODE); // find HTTP status 

    curl_close($ch); // close handle 

    return $status; 
} 

Как я могу изменить эту функцию, чтобы следовать 301 & 302 редирект (возможность несколько перенаправлений) и получить окончательный код статуса HTTP?

+0

Возможный дубликат [Make curl follow redirects?] (Http://stackoverflow.com/questions/3519939/make-curl-follow-redirects) –

ответ

17

комплект CURLOPT_FOLLOWLOCATION до TRUE.

$opts = array(CURLOPT_RETURNTRANSFER => true, // do not output to browser 
       CURLOPT_URL => $url,   // set URL 
       CURLOPT_NOBODY => true,   // do a HEAD request only 
       CURLOPT_FOLLOWLOCATION => true // follow location headers 
       CURLOPT_TIMEOUT => $timeout); // set timeout 

Если вы не привязаны к скручиванию, вы можете сделать это с помощью стандартных PHP HTTP оберток, а также (что может быть даже свернуться затем внутри). Пример кода:

$url = 'http://example.com/'; 
$code = FALSE; 

$options['http'] = array(
    'method' => "HEAD" 
); 

$context = stream_context_create($options); 

$body = file_get_contents($url, NULL, $context); 

foreach($http_response_header as $header) 
{ 
    sscanf($header, 'HTTP/%*d.%*d %d', $code); 
} 

echo "Status code (after all redirects): $code<br>\n"; 

См. Также HEAD first with PHP Streams.

Связанный с этим вопрос: How can one check to see if a remote file exists using PHP?.

+0

отличный ответ. в моем случае мне понадобилось окончательное местоположение, поэтому сделаем 'sscanf ($ header, 'Location:% s', $ loc);' сделал трюк. Спасибо! – noinput