2011-12-30 11 views
5

WebページのHTTPコードに次のPHP関数を作成しました。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

[カールはリダイレクトに従いますか?](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

関連する問題