Как было предложено в the other answer here, я использовал функцию от комментариев в PHP documentation, но обнаружил, что это неоптимальное, трудно читать/поддерживать, а не полностью по сравнению с (несоответствующим) корпусом некоторых заголовков.
Итак, потому что мне нужно было действительно иметь возможность полагаться на него, я переделал его, чтобы быть более очевидными и обрабатывать большее количество ребер-дела лучше, а - исходный код даже государство «сделать некоторые неприятные струнные манипуляции, чтобы восстановить в оригинальной буквенной форме « и « это должно работать в большинстве случаев », что не очень приятно для чего-то, от чего вы можете зависеть.
Это не идеально, но я считаю, что он более надежный. Единственное, чего ему не хватает - это работать с фактическими или оригинальными заголовками, так как любые изменения в $_SERVER
будут отражены в выходе. Это можно смягчить, сделав результат статическим и запустив функцию в первую очередь при каждом запросе.
<?php
// Drop-in replacement for apache_request_headers() when it's not available
if(!function_exists('apache_request_headers')) {
function apache_request_headers() {
// Based on: http://www.iana.org/assignments/message-headers/message-headers.xml#perm-headers
$arrCasedHeaders = array(
// HTTP
'Dasl' => 'DASL',
'Dav' => 'DAV',
'Etag' => 'ETag',
'Mime-Version' => 'MIME-Version',
'Slug' => 'SLUG',
'Te' => 'TE',
'Www-Authenticate' => 'WWW-Authenticate',
// MIME
'Content-Md5' => 'Content-MD5',
'Content-Id' => 'Content-ID',
'Content-Features' => 'Content-features',
);
$arrHttpHeaders = array();
foreach($_SERVER as $strKey => $mixValue) {
if('HTTP_' !== substr($strKey, 0, 5)) {
continue;
}
$strHeaderKey = strtolower(substr($strKey, 5));
if(0 < substr_count($strHeaderKey, '_')) {
$arrHeaderKey = explode('_', $strHeaderKey);
$arrHeaderKey = array_map('ucfirst', $arrHeaderKey);
$strHeaderKey = implode('-', $arrHeaderKey);
}
else {
$strHeaderKey = ucfirst($strHeaderKey);
}
if(array_key_exists($strHeaderKey, $arrCasedHeaders)) {
$strHeaderKey = $arrCasedHeaders[$strHeaderKey];
}
$arrHttpHeaders[$strHeaderKey] = $mixValue;
}
return $arrHttpHeaders;
}
}
код [текущие документы] (http://www.php.net/manual/en/intro.apache.php) еще отметить, что 'Апач _ *()' функции доступно только при запуске PHP в качестве модуля Apache. [Specific doc] (http://www.php.net/manual/en/function.apache-request-headers.php) для 'apache_request_headers()' говорит, что теперь он (> = 5.4.0) доступен в FastCGI , но я сомневаюсь, что он доступен * безоговорочно *, например, под IIS? – Benjamin