【问题标题】:How to print all information from an HTTP request to the screen, in PHP如何在 PHP 中将 HTTP 请求中的所有信息打印到屏幕上
【发布时间】:2011-03-09 08:28:18
【问题描述】:

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

有人有这样的代码吗?

【问题讨论】:

  • 现在,Chrome 和 Firefox 都可以让您在浏览器内的 developer tools 中轻松查看网络流量(包括请求和响应的标头)。无需在 PHP 中手动处理打印标题。
  • @dimo414,在某些情况下,到达服务器的内容与浏览器发送的内容不同,例如当连接通过代理或 CDN 时...
  • 是的。在某些情况下,您从 C# 应用程序而不是浏览器发送请求。

标签: php http


【解决方案1】:

问题是,在 URL 中我写的是 http://my_domain 而不是 https://my_domain

【讨论】:

    【解决方案2】:

    没有人提到如何在任何情况下正确转储 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

    【讨论】:

    • 想评论一下您为什么提出这个建议?也许从你自己添加一些代码?该链接重定向到“如何在 CGI/FastCGI SAPI 下使用 PHP 转储 http 请求标头”,您确定 OP 要求提供 CGI/FastCGI SAPI?
    • 因为没有人正确建议如何使用 PHP 转储 HTTP 标头。
    • 我需要在我的脚本中转储 http 标头。我阅读了这个主题,但上面的答案都没有帮助,我自己找到了解决方案。现在我将这些信息分享给其他人。怎么了?
    • Yaroslav,问题是如何在 PHP 中做到这一点,而给出的其他答案仅适用于选择的 PHP 服务器 API。问题不是“如何在 mod_php 中转储标头”。
    【解决方案3】:

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

    我在标题“content-length=735”和“php://input”中有一个请求是空字符串。所以取决于 HTTP 请求的好坏程度。

    【讨论】:

    • 我在使用 POSTMAN 时遇到了同样的问题,所以对于常规请求,我只使用 $_REQUEST 或 $_POST/$_GET...
    【解决方案4】:

    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 -S 内置网络服务器一起使用,这是 PHP 的一个非常方便的功能。

    【讨论】:

      【解决方案5】:

      如果您想要实际的 HTTP 标头(请求和响应),请尝试 hurl.it

      您可以使用 PHP 命令apache_request_headers() 获取请求标头,使用apache_response_headers() 获取当前响应标头。请注意,只要尚未提供内容,就可以稍后在 PHP 脚本中更改响应。

      【讨论】:

      【解决方案6】:

      最后:

      print_r($_REQUEST);
      

      这涵盖了大多数传入的项目:PHP.net Manual: $_REQUEST

      【讨论】:

      • 我认为 op 想要 HEADERS。这个,由文档是associative array that by default contains the contents of $_GET, $_POST and $_COOKIE。所以对于一个简单的GET 请求,它是空的。
      • 不提供标题。
      【解决方案7】:

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

      print_r(get_headers());
      

      【讨论】:

      • get_headers() 用于获取另一个 URL 的标头,而不是当前请求。
      【解决方案8】:

      嗯,你可以阅读整个 POST 正文 like so

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

      而且,假设您的网络服务器是 Apache,您可以读取请求标头 like so

      $requestHeaders = apache_request_headers();
      

      【讨论】:

      • 最好的(y)
      • apache_request_headers(),也适用于 PHP 的内置服务器。尽管名字。它有一个别名getallheaders()
      【解决方案9】:

      一个简单的方法是:

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

      需要进行一些按摩才能按您想要的顺序获得所有内容,并排除您不感兴趣但应该让您开始的变量。

      【讨论】:

      • 标题位于$_SERVER。基本漂亮的打印:foreach($_SERVER as $key =&gt; $val) echo($key . "=&gt;" . $val . "&lt;br/&gt;";.
      猜你喜欢
      • 1970-01-01
      • 2021-01-21
      • 2018-08-07
      • 1970-01-01
      • 1970-01-01
      • 2014-10-22
      • 2021-12-20
      • 2023-03-15
      • 1970-01-01
      相关资源
      最近更新 更多