Wie in the other answer here vorgeschlagen habe ich die Funktion aus den Kommentaren in den PHP documentation verwendet, fand aber, dass es nicht optimal ist, hart zu lesen/zu warten, und nicht abgeschlossen im Vergleich zur (nicht übereinstimmenden) Hülle einiger Header.
Also, weil ich wirklich musste in der Lage sein, darauf zu verlassen, ich habe es umcodiert deutlicher zu sein und mehr kanten Fälle besser als auch handhaben - der ursprüngliche Code selbst sagt „haben einige bösen Stringmanipulationen wiederherstellen der ursprüngliche Briefkasten " und " sollte dies in den meisten Fällen funktionieren ", das klingt nicht gut für etwas, auf das Sie sich verlassen können sollten.
Es ist nicht perfekt, aber ich finde, dass es zuverlässiger ist. Eine Sache, die es fehlt, ist die Arbeit an den tatsächlichen oder ursprünglichen Headern, da alle Änderungen an $_SERVER
in der Ausgabe widergespiegelt werden. Dies kann gemildert werden, indem das Ergebnis statisch gemacht wird und die Funktion als erstes bei jeder Anfrage ausgeführt wird.
<?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;
}
}
Die [aktuelle docs] (http://www.php.net/manual/en/intro.apache.php) noch erwähnen, dass 'Apache _ *()' Funktionen sind nur verfügbar, wenn PHP als Apache-Modul ausgeführt wird. Das [spezifische Dokument] (http://www.php.net/manual/en/function.apache-request-headers.php) für 'apache_request_headers()' sagt, dass es jetzt (> = 5.4.0) unter FastCGI verfügbar ist , aber ich bezweifle, dass es * unbedingt * unter IIS zum Beispiel verfügbar ist? – Benjamin