2010-05-26 17 views
29

Ich habe gerade meine Skripte auf einen anderen Server umgestellt. Auf dem vorherigen Server funktionierte das einwandfrei, und jetzt, da ich sie auf einen anderen Server umgestellt habe, kann ich das Problem nicht verstehen.Aufruf zu undefinierter Funktion apache_request_headers()

Ich bin mir nicht sicher, es würde helfen, aber hier ist der entsprechende Code.

$headers = apache_request_headers();

PHP Version ist: PHP 5.3.2

Jede Hilfe würde geschätzt.

Antwort

23

Vom docs, vor der Veröffentlichung von PHP 5.4.0:

Diese Funktion wird nur unterstützt, wenn PHP als Apache-Modul installiert ist.

PHP 5.4.0 und höher unterstützen diese Funktion unbedingt.

Diese Dokumentation enthält auch Ersatzfunktionen, die die Funktionalität von apache_request_headers durch schritt durch $_SERVER nachahmen.

+0

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

48

Sie können folgende Ersatzfunktion verwenden:

<?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); 
} 
/// 
} 
/// 
?> 

Quelle: PHP Manual

+0

funktioniert gut nett! – Zabs

+0

Ich habe diese Funktion auf meiner Website verwendet, aber es scheint langsam zu laufen, gibt es Möglichkeiten, es zu beschleunigen? – Zabs

+0

@Zabs: Ja, Sie können '$ arh' als statische Variable in dieser Funktion einrichten, um sicherzustellen, dass sie nur einmal ausgeführt wird. [Beispiel] (http://pastebin.com/2NGARe49) – machineaddict

1

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; 

    } 
} 
11

wenn PHP als Apache-Modul installiert ist:

apache_request_headers()["Authorization"]; 

sonst, gehen Sie zu .htaccess Datei und fügen:

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

Sie dann Request-Header eines dieser zugreifen können:

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

ODER

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

Dies für mich funktionierte – adrian4aes

+1

Funktioniert gut, um die Autorisierung, Danke :) – Tiger

+0

Benötigt die. Htaccess und die Funktion von @Babatunde Adeyemi. Danke! –

3

gleiche Sache mit mir passiert, wenn „apache_request_headers mit() "Also habe ich diesen Code verwendet - funktioniert perfekt für mich, um alle Überschriften auszugeben:

<?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>"; 
     } 
    } 

?> 

Ausgabebeispiel:

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

Ich kann den Berechtigungsheader nicht bekommen, wenn diese Funktion – adrian4aes

+0

Warum geben Sie $ i [$ headers] einen Wert, bevor Sie ihn ausgeben? –

+1

es funktioniert für mich, danke..ich fange mit if ($ i [$ headers] == "Authorization") { –

Verwandte Themen