2010-05-26 12 views
29

पर कॉल करें मैंने अपनी स्क्रिप्ट को एक अलग सर्वर पर स्विच कर दिया है। पिछले सर्वर पर यह बेकार ढंग से काम करता था, और अब जब मैंने उन्हें एक अलग सर्वर पर स्विच किया है, तो मैं समस्या को समझ नहीं पा रहा हूं।अपरिभाषित फ़ंक्शन apache_request_headers()

मुझे यकीन नहीं है कि इससे मदद मिलेगी, लेकिन यहां प्रासंगिक कोड है।

$headers = apache_request_headers();

पीएचपी संस्करण है: PHP 5.3.2

किसी भी मदद की सराहना की जाएगी।

उत्तर

23

docs से, पीएचपी 5.4.0 के रिलीज से पहले:

यह फ़ंक्शन केवल समर्थित है जब पीएचपी एक अपाचे मॉड्यूल के रूप में स्थापित किया गया है।

PHP 5.4.0 और बाद में इस फ़ंक्शन को बिना शर्त समर्थन दें।

ने कहा कि दस्तावेज़ों में प्रतिस्थापन कार्यों को भी शामिल किया गया है जो की कार्यक्षमता की नकल करते हैं $_SERVER के माध्यम से।

+0

[वर्तमान डॉक्स] (http://www.php.net/manual/en/intro.apache.php) अभी भी है कि 'अपाचे _ *()' कार्य हैं उल्लेख केवल अपाचे मॉड्यूल के रूप में PHP चलाते समय उपलब्ध। 'Apache_request_headers() 'के लिए [विशिष्ट दस्तावेज़] (http://www.php.net/manual/en/function.apache-request-headers.php) कहता है कि यह अब (> = 5.4.0) फास्टसीजीआई के तहत उपलब्ध है , लेकिन मुझे संदेह है कि यह उपलब्ध है * बिना शर्त *, उदाहरण के लिए आईआईएस के तहत? – 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 में टिप्पणी से समारोह का इस्तेमाल किया है, लेकिन पाया कि यह करने से इनकी है, मुश्किल कुछ शीर्षकों के (गैर-अनुरूप) आवरण की तुलना में पढ़ने/बनाए रखने, और पूर्ण करने के लिए नहीं।

तो क्योंकि मैं करने की जरूरत वास्तव में, उस पर भरोसा करने के लिए सक्षम हो मैं इसे और अधिक स्पष्ट हो सकता है और बेहतर रूप में अच्छी तरह अधिक किनारे मामलों को संभालने के लिए recoded - मूल कोड भी कहा गया है "कुछ बुरा स्ट्रिंग जोड़तोड़ बहाल करने के लिए है मूल पत्र केस " और " यह ज्यादातर मामलों में काम करना चाहिए ", जो किसी चीज़ के लिए अच्छा नहीं लगता है जिस पर आप निर्भर होना चाहिए।

यह सही नहीं है, लेकिन मुझे लगता है कि यह अधिक विश्वसनीय है। एक चीज की कमी यह वास्तविक या मूल शीर्षकों पर काम करना है, क्योंकि $_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_request_headers()["Authorization"]; 
बाकी

, में जाते हैं।इनको फ़ाइल और जोड़ें:

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

फिर आप इनमें से किसी भी का उपयोग कर अनुरोध हेडर पहुँच सकते हैं:

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

या

जब "apache_request_headers का उपयोग कर
$app->request->headers("Authorization"); // if using PHP Slim 
+1

यह फ़ंक्शन – adrian4aes

+1

मेरे लिए काम करता है तो प्राधिकरण प्राप्त करने के लिए ठीक काम कर रहा है, धन्यवाद :) – Tiger

+0

.htaccess और @ बाबातुंडे एडेमी के कार्य की आवश्यकता है। धन्यवाद! –

3

एक ही बात मुझे क्या हुआ() "इसलिए मैंने इस कोड का उपयोग किया - सभी शीर्षकों को आउटपुट करने के लिए मेरे लिए पूरी तरह से काम करता है:

<?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 [$ शीर्षलेख] को मान क्यों दे रहे हैं? –

+1

यह मेरे लिए काम कर रहा है, धन्यवाद .. मैं पकड़ता हूं (अगर मैं [$ हेडर] == "प्राधिकरण") { –

संबंधित मुद्दे