2010-05-26 21 views
29

Acabo de cambiar mis scripts a un servidor diferente. En el servidor anterior, esto funcionó perfectamente, y ahora que los he cambiado a un servidor diferente, no puedo entender el problema.Llamada a la función no definida apache_request_headers()

No estoy seguro de que ayudaría, pero aquí está el código correspondiente.

$headers = apache_request_headers();

PHP Version es: PHP 5.3.2

sería apreciada Cualquier ayuda.

Respuesta

23

Desde el docs, antes del lanzamiento de PHP 5.4.0:

Esta función sólo se admite cuando PHP está instalado como un módulo de Apache.

PHP 5.4.0 y posterior admiten esta función incondicionalmente.

Dichos documentos también incluyen funciones de reemplazo que imitan la funcionalidad de apache_request_headers al recorrer $_SERVER.

+0

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

48

Puede utilizar la siguiente función de reemplazo:

<?php 
if(!function_exists('apache_request_headers')) { 
/// 
function apache_request_headers() { 
    $arh = array(); 
    $rx_http = '/\AHTTP_/'; 
    foreach($_SERVER as $key => $val) { 
    if(preg_match($rx_http, $key)) { 
     $arh_key = preg_replace($rx_http, '', $key); 
     $rx_matches = array(); 
     // do some nasty string manipulations to restore the original letter case 
     // this should work in most cases 
     $rx_matches = explode('_', $arh_key); 
     if(count($rx_matches) > 0 and strlen($arh_key) > 2) { 
     foreach($rx_matches as $ak_key => $ak_val) $rx_matches[$ak_key] = ucfirst($ak_val); 
     $arh_key = implode('-', $rx_matches); 
     } 
     $arh[$arh_key] = $val; 
    } 
    } 
    return($arh); 
} 
/// 
} 
/// 
?> 

Fuente: PHP Manual

+0

funciona bien! – Zabs

+0

He usado esta función en mi sitio pero parece que funciona lentamente, ¿hay alguna forma de acelerarla? – Zabs

+0

@Zabs: Sí, puede configurar '$ arh' como una variable estática en esta función para asegurarse de que se ejecute solo una vez. [Ejemplo] (http://pastebin.com/2NGARe49) – machineaddict

1

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; 

    } 
} 
11

si PHP está instalado como un módulo de Apache :

apache_request_headers()["Authorization"]; 

otra cosa, ir a .htaccess archivo y añadir:

SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1 

A continuación, puede acceder a las cabeceras de petición utilizando cualquiera de estos:

$_SERVER["HTTP_AUTHORIZATION"]; // using super global 

O

$app->request->headers("Authorization"); // if using PHP Slim 
+1

Esto funcionó para mí – adrian4aes

+1

Está bien para obtener la autorización, gracias :) – Tiger

+0

Se necesita el .htaccess y la función de @Babatunde Adeyemi. ¡Gracias! –

3

mismo me pasó a mí cuando se utiliza "apache_request_headers() "así que utilicé este código - funciona perfectamente para mí para dar salida a todos los encabezados:

<?php 

    $headers = array(); 

    foreach($_SERVER as $key => $value) { 
     if(strpos($key, 'HTTP_') === 0) { 
      $headers = str_replace(' ', '-', ucwords(str_replace('_', ' ', strtolower(substr($key, 5))))); 
      echo $headers." : ". $i[$headers] = $value . "<br>"; 
     } 
    } 

?> 

ejemplo de salida:

Accept : text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
Accept-Encoding : gzip, deflate 
Accept-Language : en-US,en;q=0.5 
Cache-Control : max-age=0 
Connection : keep-alive 
Host : example.com 
Referer : https://example.com/ 
User-Agent : Mozilla/5.0 (Windows NT 6.1; WOW64; rv:35.0) Gecko/20100101 Firefox/35.0 
+1

No puedo obtener el encabezado Authorization si esta función – adrian4aes

+0

¿Por qué asigna valor a $ i [$ headers] antes de repetirla? –

+1

funciona para mí, gracias ... atrapo con if ($ i [$ headers] == "Autorización") { –

Cuestiones relacionadas