根据文档: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()); ?>
这种奇怪的行为很奇怪.所以有两个问题:
>为什么呢? (我不确定这个问题是否是基于观点的,如果没有,请省略它.我的意思是有时基于观点的问题不是基于观点的,确实有解释,而这是无法预测的在被问到之前).
>我知道我可以使用自己的函数来设置标头,该标头将设置标头,并且还要记住已设置了此标头.但这是一种…解决方法,因为header_list()可以肯定在这里.此外,这些标头位于PHP引擎内存中的某个位置,因此第二次将其保存在脚本中对内存效率不高.那么…获取所有标头的后门是什么,而不像下面的变通方法那样愚蠢?例如,这对于作为debug / developer类的一部分很有用,该类在页面末尾将所有“ developer”数据呈现为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());
?>
解决方法:
检查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 /是因为这是在PHP 5.4之前显式设置状态代码的方式:此后,为了便于阅读,建议使用http_response_code
.所使用的header()令人困惑,因为您在这个问题中询问的原因和一般原则是:http header BNF显然不包括状态行:
06002
PHP分别处理其他值,因为它们是单值标头和/或它们的值对于以后的计算效率至关重要.
TL; DR:headers_list()中不包含header()设置的HTTP /,因为从严格的RFC角度来看,HTTP /状态行不是标题.但是对于PHP< 5.4局限性在于header()是设置HTTP /状态的唯一方法,它可能从来就不是一个令人困惑的问题.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。