cURL и перенаправления – возврат нескольких заголовков?

Я пишу специализированный прокси-сервер PHP и смущен функцией cURL.

Если установлены следующие значения:

curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, true ); curl_setopt( $ch, CURLOPT_HEADER, true ); curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true ); 

cURL правильно обрабатывает перенаправления, но возвращает ВСЕ заголовки страниц, а не только конечную (не перенаправляемую) страницу, например

 HTTP/1.1 302 Found Location: http://otherpage Set-Cookie: someCookie=foo Content-Length: 198 HTTP/1.1 200 OK Content-Type: text/html; charset=utf-8 Content-Length: 3241 <!DOCTYPE HTML> ...rest of content 

Обратите внимание, что CURLOPT_HEADER установлен, потому что мне нужно прочитать и скопировать части исходного заголовка в мой заголовок прокси.

Я понимаю, почему он возвращает все эти заголовки (например, мой прокси-код должен обнаруживать любые файлы cookie, установленные в заголовке 302, и передавать их). ОДНАКО, это также делает невозможным обнаружение, когда заголовки заканчиваются и начинается контент. Как правило, с одним заголовком мы могли бы просто сделать простой раскол:

 $split = preg_split('/\r\n\r\n/', $fullPage, 2) 

Но это явно не сработает. Гектометр Мы могли бы попробовать что-то, что только разбивается, если выглядит, что следующая строка является частью заголовка:

 $split = preg_split('/\r\n\r\nHTML\/(1\.0|1\.1) \\d+ \\w+/', $fullPage) // matches patterns such a "\r\n\r\nHTML/1.1 302 Found" 

Который будет работать почти все время, но задыхается, если на их странице есть следующее:

 ...and for all you readers out there, here is an example HTTP header: <PRE> HTTP/1.1 200 OK 

МЯЧИ!

Мы действительно хотим, чтобы split прекратил сопоставлять, как только он встречает любой шаблон \r\n\r\n , за которым сразу не следует HTML/1.x – есть ли способ сделать это с помощью PHP RegExs? Даже это решение может захлебываться (довольно редкой) ситуацией, когда кто-то помещает HTTP-заголовок прямо в начале своего контента. Есть ли способ в cURL получить все возвращенные страницы в виде массива?

Вы можете получить информацию об общем размере заголовка и разбить строку следующим образом:

 $buffer = curl_exec($ch); $curl_info = curl_getinfo($ch); curl_close($ch); $header_size = $curl_info["header_size"]; $header = substr($buffer, 0, $header_size); $body = substr($buffer, $header_size) 

Информация взята из полезного поста «дедушкой» .

 $header_size = $curl_info["header_size"]; $header = substr($buffer, 0, $header_size-1); $body = substr($buffer, $header_size); 

используйте curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false);

TRUE следовать за любым заголовком «Location:», который сервер отправляет как часть HTTP-заголовка (обратите внимание, что это рекурсивно, PHP будет следовать за множеством заголовков «Location:», которые отправляются, если не установлен CURLOPT_MAXREDIRS).

Нужно добавить, чтобы завивать конфигурации:

 curl_setopt( $ch, CURLOPT_HTTPHEADER, array("Expect:")); 

Это решит проблему.