Как получить заголовки из последнего перенаправления с помощью функций PHP curl? - PullRequest
4 голосов
/ 25 июля 2010

Если я выполняю запрос cURL, который настроен на выполнение перенаправлений, и возвращаю заголовки, он возвращает заголовки для ВСЕХ перенаправлений.

Я хочу только последний возвращенный заголовок (и тело контента). Как мне этого добиться?

Ответы [ 4 ]

3 голосов
/ 25 июля 2010

Вот еще один способ:

<code>$url = 'http://google.com';

$opts = array(CURLOPT_RETURNTRANSFER => true,
              CURLOPT_FOLLOWLOCATION => true,
              CURLOPT_HEADER         => true);
$ch = curl_init($url);
curl_setopt_array($ch, $opts);
$response       = curl_exec($ch);
$redirect_count = curl_getinfo($ch, CURLINFO_REDIRECT_COUNT);
$status         = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$response       = explode("\r\n\r\n", $response, $redirect_count + 2);
$last_header    = $response[$redirect_count];
if ($status == '200') {
    $body = end($response);
} else {
    $body = '';
}
curl_close($ch);

echo '<pre>';
echo 'Redirects: ' . $redirect_count . '<br />';
echo 'Status: ' . $status . '<br />';
echo 'Last response header:<br />' . $last_header . '<br />';
echo 'Response body:<br />' . htmlspecialchars($body) . '<br />';
echo '
';

Конечно, вам потребуется дополнительная проверка ошибок, например, для тайм-аута и т. Д.

2 голосов
/ 25 июля 2010

Найдите вывод «HTTP / 1.1 200 OK» в начале строки - это место, где начнется ваш последний запрос.Все остальные будут давать другие HTTP-коды возврата.

0 голосов
/ 04 августа 2017

Поздний ответ, но, возможно, более простой способ;

$result = explode("\r\n\r\n", $result);

// drop redirect etc. headers
while (count($result) > 2) {
    array_shift($result);
}

// split headers / body parts
@ list($headers, $body) = $result;
0 голосов
/ 08 марта 2017
  1. Выполнить ваш запрос

  2. Взять длину заголовка из curl_getinfo s возвращаемого значения

  3. Получитьчасть между последним \r\n\r\n (но до конца заголовка) и концом заголовка как последний заголовок

// Step 1: Execute
$fullResponse = curl_exec($ch);

// Step 2: Take the header length
$headerLength = curl_getinfo($ch, CURLINFO_HEADER_SIZE);

// Step 3: Get the last header
$header = substr($fullResponse, 0, $headerLength - 4);
$lastHeader = substr($header, (strrpos($header, "\r\n\r\n") ?: -4) + 4);

Конечно, если у вас PHP <5.3, вынеобходимо развернуть оператор <a href="https://en.wikipedia.org/wiki/Elvis_operator" rel="nofollow noreferrer"> elvis до конструкции if / else.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...