Como se sugiere en the other answer here, he utilizado la función de los comentarios en el PHP documentation, pero se encontró que es subóptima, dura para leer/mantener, y no completa en comparación con la carcasa (no conforme) de algunos encabezados.
Así porque necesitaba realmente ser capaz de confiar en él, recodificado a ser más evidente y manejar más de borde casos mejor, así - el código original, incluso afirma "Por qué algunas manipulaciones de cadenas desagradables para restaurar la caja con la letra original " y " esto debería funcionar en la mayoría de los casos ", lo cual no suena bien para algo en lo que pueda confiar.
No es perfecto, pero creo que es más confiable. Una cosa que le falta es trabajar en los encabezados reales u originales, ya que cualquier modificación a $_SERVER
se reflejará en la salida. Esto puede mitigarse haciendo el resultado estático y ejecutando la función como lo primero en cada solicitud.
<?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;
}
}
El [docs actuales] (http://www.php.net/manual/en/intro.apache.php) todavía mencionan que 'Apache _ *()' funciones son solo disponible cuando se ejecuta PHP como módulo de Apache. El [documento específico] (http://www.php.net/manual/en/function.apache-request-headers.php) para 'apache_request_headers()' dice que ahora está disponible (> = 5.4.0) en FastCGI , pero dudo que esté disponible * incondicionalmente *, bajo IIS, por ejemplo. – Benjamin