如何在PHP中将HTTP请求的所有信息打印到屏幕上

72

我需要一些PHP代码,能够转储HTTP请求中的所有信息,包括标头和POST请求中包含的任何信息的内容。基本上,这是一个诊断工具,可以输出我发送到服务器的内容。

请问有没有人有能够实现这个功能的代码?


2
现在,Chrome和Firefox都可以让您轻松地在其浏览器内的开发者工具中查看网络流量(包括请求和响应的标头)。无需在PHP中手动打印标头。 - dimo414
@dimo414,有些情况下,到达服务器的内容与浏览器发送的内容不同,例如当连接经过代理或CDN时... - Sam Sirry
是的。有时您会从 C# 应用程序而不是浏览器发送请求。 - Elmue
8个回答

60
获取$_GET, $_POST, $_COOKIE的方法:
print_r($_REQUEST);

如果你想要标题:
print_r(apache_request_headers());

3
我认为这位用户想要标题。根据文档,它是“一个关联数组,其中默认包含 $_GET、$_POST 和 $_COOKIE 的内容”。所以对于一个简单的 GET 请求,它是空的。 - Buzut
1
不提供头文件。 - Skippy le Grand Gourou

38

你可以像这样读取POST请求的整个请求体

echo file_get_contents( 'php://input' );

假设你的Web服务器是Apache,你可以这样读取请求头信息

$requestHeaders = apache_request_headers();

最好的(y) - bikash.bilz
1
apache_request_headers(), works also for Php's built in server. Despite the name. It has an alias getallheaders() - Progrock

33

一个简单的方法是:

<?php
print_r($_SERVER);
print_r($_POST);
print_r($_GET);
print_r($_FILES);
?>

需要进行一些调整才能按照您想要的顺序排列所有内容,并排除您不感兴趣的变量,但这应该可以帮助您入门。


头信息存储在 $_SERVER 中。基本的漂亮打印方式为:foreach($_SERVER as $key => $val) echo($key . "=>" . $val . "<br/>"; - Skippy le Grand Gourou

19

在任何情况下,没有人提到如何正确地转储HTTP标头。

根据CGI规范rfc3875的第4.1.18节:

以“HTTP_”开头的元变量包含从客户端请求头字段中读取的值(如果使用的协议是HTTP)。 HTTP标头字段名称会被转换为大写字母,并将所有“-”替换为“”,然后以“HTTP”作为前缀来生成元变量名称。

foreach ($_SERVER as $key => $value) {
    if (strpos($key, 'HTTP_') === 0) {
        $chunks = explode('_', $key);
        $header = '';
        for ($i = 1; $y = sizeof($chunks) - 1, $i < $y; $i++) {
            $header .= ucfirst(strtolower($chunks[$i])).'-';
        }
        $header .= ucfirst(strtolower($chunks[$i])).': '.$value;
        echo $header.'<br>';
    }
}

细节: http://cmyker.blogspot.com/2012/10/how-to-dump-http-headers-with-php.html


1
介意解释一下为什么你提出这个建议吗?也许添加一些自己的代码会更好?该链接重定向到“如何在CGI/FastCGI SAPI下使用PHP转储http请求头”,你确定OP要求使用CGI/FastCGI SAPI吗? - Yaroslav
2
因为没有人正确地建议如何使用PHP转储HTTP头。 - Cmyker
2
我需要在我的脚本中转储HTTP标头。我阅读了这个主题,但上面的答案都没有帮助我,我自己找到了解决方案。现在我将这些信息分享给其他人。有什么问题吗? - Cmyker
1
Yaroslav,问题是如何在PHP中实现,其他给出的答案仅适用于选择的PHP服务器API。问题不是“如何在mod_php中转储标头”。 - GDR

9

结合来自Peter BaileyCmyker的答案,您可以得到类似以下的内容:

<?php
foreach ($_SERVER as $key => $value) {
    if (strpos($key, 'HTTP_') === 0) {
        $chunks = explode('_', $key);
        $header = '';
        for ($i = 1; $y = sizeof($chunks) - 1, $i < $y; $i++) {
            $header .= ucfirst(strtolower($chunks[$i])).'-';
        }
        $header .= ucfirst(strtolower($chunks[$i])).': '.$value;
        echo $header."\n";
    }
}
$body = file_get_contents('php://input');
if ($body != '') {
  print("\n$body\n\n");
}
?>

这个功能可以与PHP内置的php -S web服务器一起使用,这是PHP相当方便的一个功能。


3
如果您需要查看实际的HTTP头(包括请求和响应),可以尝试使用hurl.it
您可以使用PHP命令apache_request_headers()获取请求头,并使用apache_response_headers()获取当前响应头。请注意,只要内容未被服务,响应就可以在PHP脚本中稍后更改。

这个SO答案列出了一些工具,比如hurl.it:http://stackoverflow.com/a/12637452/363573 - Stephan

1

file_get_contents('php://input')并不总是有效。

我收到的请求头中有content-length=735,但php://input是空字符串。这取决于HTTP请求的质量/有效性。


我在使用POSTMAN时遇到了同样的问题,因此对于常规请求,我只使用$_REQUEST或$_POST/$_GET... - Pini Cheyni

0

另外,您可以使用get_headers()。 它不依赖于apache。

print_r(get_headers());

5
get_headers() 函数是用来获取另一个 URL 的头信息,而不是当前请求的。 - tvanc

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