Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 卷曲和重定向-返回多个标题?_Php_Regex_Redirect_Curl - Fatal编程技术网

Php 卷曲和重定向-返回多个标题?

Php 卷曲和重定向-返回多个标题?,php,regex,redirect,curl,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 Locati

我正在编写一个专门的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
但这显然在这里行不通。嗯。如果下一行看起来是标题的一部分,我们可以尝试一些只拆分的内容:

$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
…对于所有读者,这里有一个HTTP头示例:
HTTP/1.1200ok


我们真的希望拆分在遇到
\r\n\r\n
的任何模式后,立即停止匹配,而
HTML/1.x
-有没有办法用PHP正则表达式实现这一点?即使是这种解决方案也会在(非常罕见的)情况下出现阻塞,即有人将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)
信息取自。

使用
curl\u setopt($ch,CURLOPT\u FOLLOWLOCATION,false)


如果在服务器作为HTTP头的一部分发送的任何“Location:”头之后加上TRUE(注意,这是递归的,除非设置了CURLOPT_MAXREDIRS,否则PHP将在发送的所有“Location:”头之后加上)。

需要添加curl配置:

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

这将是解决问题的关键

很好的建议,我一直在想这个问题,每次我得到一个可能不是最后一个的已知http状态时,我都会检查接下来的几个标题。$body=substr($buffer,$header\u size+1)=>这将删除正文的第一个字符。substr($buffer,$header_size)为correct@Claude:谢谢你的更正!编辑以反映它。当你看到这样的错误时,请随意点击按钮,建议修改答案;这样,即使作者早已离开,mods也可以实现更正。当前面的页面(重定向跳)返回响应正文和http 301/302头时,这将不起作用。对不起,我只想提一下重要性
$header_size = $curl_info["header_size"];
$header = substr($buffer, 0, $header_size-1);
$body = substr($buffer, $header_size);
curl_setopt( $ch, CURLOPT_HTTPHEADER, array("Expect:"));