php - cURL 和重定向 - 返回多个 header ?

标签 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,因为我需要读取部分原始 header 并将其复制到我的代理 header 中。

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

$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 RegEx 来做到这一点?即使这个解决方案也可能会因为有人将 HTTP header 放在其内容的开头(非常罕见)的情况而窒息。 cURL 有没有办法将所有返回的页面作为数组获取?

最佳答案

您可以获得总 header 大小的信息,并将字符串拆分如下:

$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" .

关于php - cURL 和重定向 - 返回多个 header ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4017911/

相关文章:

php - Laravel 更新后用户模型错误(类 User 包含 3 个抽象方法)

php - 替换制表符或多个空格

JavaScript 正则表达式 : Is there a way to match slash after slash char in URL without negative lookbehind?

regex - 正则表达式验证字段 : field must contain atleast 2 AlphaNumeric characters

java - 在 Spring MVC 中,使用 'redirect:process' 或 'redirect:/process' 在导致丢失 session 或 session 值方面是否有所不同?

ruby-on-rails - 使用表单重定向

php - 使用 PHP 按姓氏对 CSV 文件进行排序

android - 非拉丁语言环境中的 PatternSyntaxException

.htaccess - .htaccess 中的 301 重定向是否需要按优先级排序?

php - Wordpress Logo 下奇怪的黑线