Как получить заголовки из последнего перенаправления с функциями curl PHP?

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

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

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

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

$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 '</pre>'; 

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

  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, вам нужно расширить оператор elvis на конструкцию if / else.

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

 $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;