Если я выполняю запрос 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>';
Конечно, вам потребуется больше проверки ошибок, например, для тайм-аута и т. Д.
Выполните свой запрос
Возьмите длину заголовка из возвращаемого значения curl_getinfo
s
Получить часть между последним \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;