2010-05-26 4 views
29

Я только что переключил свои сценарии на другой сервер. На предыдущем сервере это работало безупречно, и теперь, когда я переключил их на другой сервер, я не могу понять проблему.Звонок на неопределенную функцию apache_request_headers()

Я не уверен, что это поможет, но вот соответствующий код.

$headers = apache_request_headers();

PHP версии: PHP 5.3.2

Любая помощь будет оценена.

ответ

23

От docs, до выхода PHP 5.4.0:

Эта функция поддерживается только тогда, когда PHP установлен как модуль Apache.

PHP 5.4.0 и более поздние версии поддерживают эту функцию безоговорочно.

Указанные документы также включают в себя функции замены, которые имитируют функциональность apache_request_headers, пройдя через $_SERVER.

+0

код [текущие документы] (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

48

Вы можете использовать следующую функцию замены:

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

Источник: PHP Manual

+0

хорошо работает! – Zabs

+0

Я использовал эту функцию на своем сайте, но, похоже, работает медленно, есть ли способы ускорить ее работу? – Zabs

+0

@ Zabs: Да, вы можете настроить '$ arh' как статическую переменную в этой функции, чтобы убедиться, что она выполняется только один раз. [Пример] (http://pastebin.com/2NGARe49) – machineaddict

1

Как было предложено в 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; 

    } 
} 
11

, если PHP установлен как модуль Apache :

apache_request_headers()["Authorization"]; 

еще, перейти к .Htaccess файл и добавить:

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

Вы можете получить доступ к заголовков запроса с использованием любого из них:

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

ИЛИ

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

Это сработало для меня – adrian4aes

+1

Работая отлично, чтобы получить авторизацию, спасибо :) – Tiger

+0

Нужен .htaccess и функция @Babatunde Adeyemi. Спасибо! –

3

То же самое случилось со мной, когда с помощью «apache_request_headers() «поэтому я использовал этот код - отлично работает для вывода всех заголовков:

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

?> 

Выходной пример:

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

Я не могу получить заголовок авторизации, если эта функция – adrian4aes

+0

Почему вы присваиваете значение $ i [$ headers], прежде чем повторять его? –

+1

это работает для меня, спасибо..и поймать с if ($ i [$ headers] == "Авторизация") { –

Смежные вопросы