【问题标题】:PHP headers_list() is not showing all headersPHP headers_list() 未显示所有标题
【发布时间】:2015-07-22 06:23:20
【问题描述】:

根据文档:http://php.net/manual/en/function.headers-list.php,以及这条评论:http://php.net/manual/en/function.headers-list.php#110330,php代码:

<?php var_dump(header_list()); ?>

不显示状态标题。


这种奇怪的行为很奇怪。所以有两个问题:

  1. 为什么?(我不确定这个问题是否基于意见,如果是,并且没有真正的解释,请忽略它。我的意思是有时基于意见的问题不是基于意见的,并且确实有解释,这在被问到之前无法预测)。
  2. 我知道我可以使用我自己的函数来设置标题,这将设置标题并另外记住该标题已设置。但这是一种……解决方法,因为 header_list() 非常确定 HERE, FOR THAT。此外,这些标头位于 php 引擎内存中的某个位置,因此在脚本中第二次保存它们并不是内存效率。所以... 什么是获取所有标头的后门,不像下面的解决方法那么愚蠢? 这可能很有用,例如作为调试/开发人员类的一部分,它呈现所有“开发人员” " 数据作为页面末尾的 html cmets。 当然,我忽略了内容长度标题,因为它太早预测了。
  3. 好像这个函数省略了所有没有冒号的标题...是不是?

要发布更多代码,头函数的简单解决方法(线性不是对象,使用全局而不是静态类只是为了展示这个想法)。假设标头函数省略了不带冒号的标头(这可能不太正确...):

<?php
    // Mechanism:
    $headers = array();
    function setHeader($header) {
        header($header);
        if (strpos($header, ':') === false) {
            global $headers;
            $headers[] = $header;
        }
    }
    function getHeaders() {
        global $headers;
        return array_merge($headers, header_list());
    }

    // Example:
    setHeader('HTTP/1.1 404 Not Found');
    var_dump(getHeaders());
?>

【问题讨论】:

  • 在尝试发送任何内容之前,我看不到该函数应该如何了解 http 状态。一般来说,我希望该函数列出由 php.ini 准备的所有标头。由于http协议本身不是由php处理,而是由底层http服务器处理,php应该如何知道呢?我同意这可能不方便。但我没有看到对此的技术解决方案。
  • 是的,但是当你设置 header('HTTP/1.1 404 Not Found');很明显,状态码将是 404 ......?如果你用 403 覆盖它,它将是 403 ......?我的意思是您是直接使用标头设置状态,那么为什么此标头不在列表中?更重要的是,当您设置编码或其他内容时,它在列表中......只有状态标题和非冒号标题不在列表中:(.
  • 我会假设这样的标头 not 出于完全相同的原因直接在 php 中排队。最终的http状态只能由http服务器设置。所以可能标题的处理方式不同。该函数列出的标头在 php 中排队,请求协议相关的标头可能以某种方式在 http 服务器和 php 之间的进程间通信中发出信号。就像一个“返回值”。
  • 好的,我明白了。随时发布有关该问题的更多信息、资源或文档的答案,我当然会接受。感谢您的帮助:)。
  • 不,谢谢:我只是在这里表达我的判断。这不是我所知道的。所以这不是一个答案。 ;-)

标签: php list header status


【解决方案1】:

检查engine source for headers_list and http_response_code,注意一般标头和状态码的值是分开的:

// headers_list
SG(sapi_headers).headers

// http_response_code
SG(sapi_headers).http_response_code

但 HTTP 响应代码并不是唯一具有专用存储的标头:Content-Type does, too:

SG(sapi_headers).mimetype = NULL;

那么这里发生了什么? complete header() algorithm 专门检查以下字符串以调整状态:

  • HTTP/
  • Content-Type
  • Content-Length
  • Location
  • WWW-Authenticate

HTTP/ 被专门检查,因为这是在 PHP 5.4 之前明确设置状态代码的方式:在那之后,http_response_code 可用并且为了清晰起见建议使用。使用 header() 令人困惑,因为您在这个问题中提出的原因和一般原则:http header BNF 显然不包括状态行:

header-field   = field-name ":" OWS field-value OWS

PHP 分别处理其他的,因为它们是单值标头和/或它们的值对以后计算的效率很重要。

TL;DR:header() 设置的HTTP/ 不包含在headers_list() 中,因为HTTP/ 状态行不是严格的RFC 意义上的标头。但是对于 PHP header() 是设置HTTP/ 状态的唯一方法,这可能从来都不是一个令人困惑的问题。

【讨论】:

    【解决方案2】:

    header_list 中似乎只缺少状态码。

    您可以使用另一个函数获取当前状态码(它们可能会相互覆盖):http_response_code

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多