根据文档: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()); ?>
不显示状态标题。
这种奇怪的行为很奇怪。那么有两个问题:
-
Why?(我不确定这个问题是否基于意见,如果是,并且没有真正的解释,请忽略它。我的意思是,有时基于意见的问题不是基于意见的,并且确实有解释,这是无法预测的在他们被问到之前)。
- 我知道我可以使用自己的函数来设置标头,这将设置标头并另外记住该标头已设置。但这是一种...解决方法,因为 header_list() 非常确定在这里,为此。此外,这些标头位于 php 引擎内存中的某个位置,因此在脚本中第二次保存它们的内存效率不高。所以...获取所有标头的后门是什么,不像下面的解决方法那么愚蠢?例如,这可以用作调试/开发人员类的一部分,该类将所有“开发人员”数据呈现为页面末尾的 html 注释。当然,我省略了内容长度标头,这还为时过早预测。
- 看起来这个函数省略了所有没有冒号的标题...是吗?
要发布更多代码,请使用标头函数的简单解决方法(线性而不是对象,使用全局变量而不是静态类只是为了展示想法)。假设标头函数省略不带冒号的标头(这可能不完全正确......):
<?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());
?>
检查引擎源headers_list and http_response_code,请注意通用标头和状态代码的值是分开的:
// headers_list
SG(sapi_headers).headers
// http_response_code
SG(sapi_headers).http_response_code
但 HTTP 响应代码并不是唯一具有专用存储的标头:Content-Type 也是如此:
SG(sapi_headers).mimetype = NULL;
那么这是怎么回事呢?这完整的 header() 算法特别检查以下字符串来调整状态:
HTTP/
Content-Type
Content-Length
Location
WWW-Authenticate
HTTP/
被专门检查,因为这是在 PHP 5.4 之前显式设置状态代码的方式:之后,http_response_code可用并为清晰起见推荐。那header()
被使用是令人困惑的,因为你在这个问题中提出的原因和一般原则是:http 标头 BNF显然不包括状态行:
header-field = field-name ":" OWS field-value OWS
PHP 单独处理其他的,因为它们是单值标头和/或它们的值对于后续计算的效率很重要。
TL;DR: HTTP/
set by header()
不包含在headers_list()
因为HTTP/
状态行不是严格 RFC 意义上的标头。但对于 PHP header()是唯一的设置方法 HTTP/
状态,它可能从来都不是一个令人困惑的问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)