PHP headers_list() 没有显示全部 headers
PHP headers_list() is not showing all headers
根据文档:http://php.net/manual/en/function.headers-list.php, and this comment: http://php.net/manual/en/function.headers-list.php#110330,php 代码:
<?php var_dump(header_list()); ?>
不显示状态 headers.
这种奇怪的行为很奇怪。所以有两个问题:
- 为什么?(我不确定这个问题是否是基于意见的,如果是,并且没有真正的解释请忽略它。我的意思是有时基于意见问题不是基于意见的,而且确实有解释,而且在被问到之前无法预测)。
- 我知道我可以使用我自己的函数来设置 header,这将设置 header 并另外记住这个 header 已设置。但这是一种...解决方法,因为 header_list() 非常确定 HERE,FOR THAT。此外,那些 header 位于 php 引擎内存中的某处,因此在脚本中第二次保存它们的内存效率不高。所以... 获得所有 header 的 back-door 是什么,不像下面的解决方法那么愚蠢? 这可能很有用,例如作为调试的一部分/ developer class 将所有 "developer" 数据呈现为页面末尾的 html 评论。 当然,我省略了内容长度 header,这太早无法预测。
- 看起来这个函数省略了所有没有冒号的header...对吗?
post 更多代码,header 函数的简单解决方法(线性不是 object,使用全局而不是静态 class 只是为了展示这个想法)。假设 header 函数省略了没有冒号的 headers(这可能不完全正确......):
<?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());
?>
header_list
.
似乎只缺少状态码
您可以使用另一个函数获取当前状态代码(它们可能会相互覆盖):http_response_code
.
检查 engine source for headers_list
and http_response_code
,注意一般 header 的值和状态代码是分开的:
// headers_list
SG(sapi_headers).headers
// http_response_code
SG(sapi_headers).http_response_code
但 HTTP 响应代码并不是唯一具有专用存储的 header: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
is available and is recommended for clarity. That header()
was used is confusing, for the reason you're asking in this question and on general principle: the http header BNF 显然不包括状态行:
header-field = field-name ":" OWS field-value OWS
PHP 单独处理其他的,因为它们是 single-value headers and/or 它们的值对以后计算的效率很重要。
TL;DR: header()
设置的 HTTP/
不包含在 headers_list()
中,因为 HTTP/
状态行不在 header 中RFC 意义。但是对于 PHP < 5.4 的限制,即 header()
是 设置 HTTP/
状态的唯一方法,它可能从来都不是一个令人困惑的问题.
根据文档:http://php.net/manual/en/function.headers-list.php, and this comment: http://php.net/manual/en/function.headers-list.php#110330,php 代码:
<?php var_dump(header_list()); ?>
不显示状态 headers.
这种奇怪的行为很奇怪。所以有两个问题:
- 为什么?(我不确定这个问题是否是基于意见的,如果是,并且没有真正的解释请忽略它。我的意思是有时基于意见问题不是基于意见的,而且确实有解释,而且在被问到之前无法预测)。
- 我知道我可以使用我自己的函数来设置 header,这将设置 header 并另外记住这个 header 已设置。但这是一种...解决方法,因为 header_list() 非常确定 HERE,FOR THAT。此外,那些 header 位于 php 引擎内存中的某处,因此在脚本中第二次保存它们的内存效率不高。所以... 获得所有 header 的 back-door 是什么,不像下面的解决方法那么愚蠢? 这可能很有用,例如作为调试的一部分/ developer class 将所有 "developer" 数据呈现为页面末尾的 html 评论。 当然,我省略了内容长度 header,这太早无法预测。
- 看起来这个函数省略了所有没有冒号的header...对吗?
post 更多代码,header 函数的简单解决方法(线性不是 object,使用全局而不是静态 class 只是为了展示这个想法)。假设 header 函数省略了没有冒号的 headers(这可能不完全正确......):
<?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());
?>
header_list
.
您可以使用另一个函数获取当前状态代码(它们可能会相互覆盖):http_response_code
.
检查 engine source for headers_list
and http_response_code
,注意一般 header 的值和状态代码是分开的:
// headers_list
SG(sapi_headers).headers
// http_response_code
SG(sapi_headers).http_response_code
但 HTTP 响应代码并不是唯一具有专用存储的 header: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
is available and is recommended for clarity. That header()
was used is confusing, for the reason you're asking in this question and on general principle: the http header BNF 显然不包括状态行:
header-field = field-name ":" OWS field-value OWS
PHP 单独处理其他的,因为它们是 single-value headers and/or 它们的值对以后计算的效率很重要。
TL;DR: header()
设置的 HTTP/
不包含在 headers_list()
中,因为 HTTP/
状态行不在 header 中RFC 意义。但是对于 PHP < 5.4 的限制,即 header()
是 设置 HTTP/
状态的唯一方法,它可能从来都不是一个令人困惑的问题.