【发布时间】:2011-04-30 09:29:14
【问题描述】:
我正在编写一个专门的 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 的任何模式时立即停止匹配,而HTML/1.x 没有紧随其后 - 有没有办法使用 PHP RegExs 做到这一点?即使是这种解决方案也可能会在某人将 HTTP 标头放在其内容的开头的(非常罕见的)情况下窒息。 cURL 中有没有办法将所有返回的页面作为数组获取?
【问题讨论】: