cURL和重定向 - 返回多个标头?

时间:2010-10-25 19:04:01

标签: php regex redirect 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已设置,因为我需要读取原始标题的一部分并将其复制到我的代理标题中。

我理解为什么它会返回所有这些标头(例如,我的代理代码必须检测302标头中设置的任何cookie并将它们传递)。但是,它也使得无法检测标题何时结束并且内容开始。通常情况下,只需一个标题我们就可以进行简单的拆分:

$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

球!

我们真的希望在遇到任何\r\n\r\n的{​​{1}}模式后立即拆分停止匹配 - 有没有办法做这与PHP RegExs?即便是这种解决方案也可能会阻塞(非常罕见)有人将HTTP标头放在内容开头的情况。在cURL中有没有办法将所有返回的页面作为数组?

4 个答案:

答案 0 :(得分:15)

您可以获取总标题大小的信息,并将字符串拆分为:

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

the helpful post by "grandpa"获取的信息。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

使用curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false);

TRUE以跟随服务器作为HTTP标头的一部分发送的任何“Location:”标头(注意这是递归的,PHP将跟随它发送的“Location:”标头,除非设置了CURLOPT_MAXREDIRS)。 / p>

答案 3 :(得分:0)

需要添加,以卷曲配置:

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

这将解决问题。