Получить HTTP-заголовок ответа / статус перенаправления с помощью PHP - PullRequest
2 голосов
/ 31 августа 2009

Привет, 1001 *

В настоящее время я работаю над инструментом на основе PHP, чтобы отслеживать довольно большое количество URL-адресов и их состояние перенаправления. Я потратил довольно много времени на то, чтобы найти лучший способ извлечь содержимое заголовков ответа HTTP для извлечения текущего кода и местоположения перенаправления. Вот как это делается на данный момент:

$resource = fopen( $url, 'r' );
$metadata = stream_get_meta_data( $resource );
$metadata = $metadata['wrapper_data'];

// Looping through the array to find the necessary fields

Это работает на 95% URL, которые я отслеживаю. Еще я решил эту проблему путем анализа фактического HTML-кода, возвращаемого веб-сайтом перед выполнением перенаправления, поскольку он содержал что-то вроде «Этот веб-сайт был перемещен сюда». Это не очень надежное решение, но в некоторых случаях оно помогло.

Это все еще оставляет мне ряд URL, которые я не могу проверить автоматически.

Такие инструменты, как Спросите Apache HTTP Headers Tool кажутся более надежными, и мне было интересно, что может быть лучшим способом получения информации о перенаправлении?

1 Ответ

6 голосов
/ 31 августа 2009

Вы также можете попробовать curl, кратчайший пример, который извлекает все заголовки, выглядит так:

<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://stackoverflow.com');
curl_setopt($ch, CURLOPT_HEADERFUNCTION, 'read_header');
curl_setopt($ch, CURLOPT_NOBODY, 1);
curl_exec($ch);

function read_header($ch, $string) {
    print "Received header: $string";
    return strlen($string);
}

Выход:

[~]> php headers.php 
Received header: HTTP/1.1 200 OK
Received header: Cache-Control: private
Received header: Content-Type: text/html; charset=utf-8
Received header: Expires: Mon, 31 Aug 2009 09:38:45 GMT
Received header: Server: Microsoft-IIS/7.0
Received header: Date: Mon, 31 Aug 2009 09:38:45 GMT
Received header: Content-Length: 118666
Received header: 

Конечно, вам нужны только заголовки, тогда fsockopen работает так же хорошо. За исключением того, что вместо GET вы должны использовать HEAD, потому что вам нужны заголовки, а не содержимое.

Кроме того, curl работает (при условии, что вы скомпилировали его с поддержкой ssl) и для https url-s.

...