如何使用PHP脚本记录原始的HTTP标头?

5
我正在使用cURL脚本通过代理发送POST数据到另一个脚本,我想查看cURL脚本发送的原始HTTP头信息。以下是我尝试过的方法列表:
  • echo curl_getinfo($ch, CURLINFO_HEADER_OUT)没有输出任何内容。
  • file_get_contents('php://input')可以获取一些HTTP头,但不是全部。
  • print_r($_SERVER)也可以获取一些HTTP头,但不是全部(我知道这一点是因为应该有一个X-Forwarded-For头,但没有)
  • 打印所有超级全局变量($_POST、$_GET、$_REQUEST、$_FILES等)仍然不能显示原始HTTP头。
  • http_get_request_headers()apache_request_headers()$http_response_header$HTTP_RAW_POST_DATA都没有输出全部内容。
请帮忙解决?
3个回答

2
打开 CURLOPT_HEADER,而不是 CURLINFO_HEADER_OUT,然后在 \r\n\r\n 处分割(这是标头的结束位置),最多分割 2 次:
<?php
$ch = curl_init('http://www.yahoo.com/');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, true);
$result = curl_exec($ch);
if ($result !== false) {
    $split_result = split("\r\n\r\n", $result, 2);
    $header = $split_result[0];
    $body = $split_result[1];
    /** Process here **/
} else {
   /** Error handling here **/
}

这基本上是正确的,除了你应该使用explode而不是split,并且它没有考虑到多个头部(比如301/302重定向)。 - cwd

1

您还需要设置CURLINFO_HEADER_OUT选项:

CURLINFO_HEADER_OUT
设置为TRUE以跟踪句柄的请求字符串。
自PHP 5.1.3以来可用。CURLINFO_前缀是有意为之。

http://www.php.net/manual/en/function.curl-setopt.php

以下代码可正常运行:

<?php

$ch = curl_init('http://www.google.com');
curl_setopt($ch, CURLINFO_HEADER_OUT, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$result = curl_exec($ch);

echo curl_getinfo($ch, CURLINFO_HEADER_OUT);

1
@php:啊,所以你实际上想知道代理发送了什么,而不是curl发送了什么。你可能需要在代理本身或远程服务器上记录它。curl不知道你的代理添加了哪些头信息。 - Tom Haigh

0
如果您在Apache上作为模块运行,则apache_request_headers()可以满足您的需求。
对于几乎任何其他架构,您只能挑选在$_SERVER中记录的内容,或者需要找到一些方法来使用Web服务器配置记录信息。

2
你一定是C语言的粉丝。 - Pacerier

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接