PHP CURL следовать перенаправлению, чтобы получить статус HTTP - PullRequest
5 голосов
/ 30 декабря 2011

Я создал следующую функцию PHP для 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?

1 Ответ

17 голосов
/ 30 декабря 2011

установите 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 с PHP Streams .

Смежный вопрос Как проверить, существует ли удаленный файл с использованием PHP? .

...