Согласно документации: 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()); ?>
Не показывает заголовки статуса.
Это странное поведение странно. Итак, есть два вопроса:
Чтобы опубликовать больше кода, простой обходной путь к функции заголовка (линейный, а не объект, использующий глобальные переменные, а не статический класс, просто чтобы показать идею). Предполагая, что функция заголовка опускает заголовки без двоеточий (что может быть не совсем верно …):
<?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
а также 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/
установить с помощью header()
не входит в headers_list()
так как HTTP/
строки состояния не являются заголовками в строгом смысле RFC. Но для PHP < 5.4 ограничение, которое header()
был единственный способ установить HTTP/
статус, это, вероятно, никогда не было бы запутанным вопросом.
Кажется, что только код состояния отсутствует в header_list
,
Вы можете получить текущий код состояния (они, вероятно, перезаписывают друг друга), используя другую функцию: http_response_code
.