मैं PHP में किसी भी अनुरोध शीर्ष लेख को कैसे पढ़ूं


271

मुझे PHP में कोई हेडर कैसे पढ़ना चाहिए?

उदाहरण के लिए कस्टम हेडर X-Requested-With:।

जवाबों:


345

IF : आपको केवल एक हेडर की आवश्यकता है, सभी हेडर के बजाय , सबसे तेज़ तरीका है:

<?php
// Replace XXXXXX_XXXX with the name of the header you need in UPPERCASE (and with '-' replaced by '_')
$headerStringValue = $_SERVER['HTTP_XXXXXX_XXXX'];


ELSE IF : आप FastCGI (सरल विधि) का उपयोग करके PHP को Apache मॉड्यूल के रूप में या PHP 5.4 के रूप में चलाते हैं:

apache_request_headers ()

<?php
$headers = apache_request_headers();

foreach ($headers as $header => $value) {
    echo "$header: $value <br />\n";
}


ईएलएसई: किसी भी अन्य मामले में, आप (यूजरलैंड कार्यान्वयन) का उपयोग कर सकते हैं:

<?php
function getRequestHeaders() {
    $headers = array();
    foreach($_SERVER as $key => $value) {
        if (substr($key, 0, 5) <> 'HTTP_') {
            continue;
        }
        $header = str_replace(' ', '-', ucwords(str_replace('_', ' ', strtolower(substr($key, 5)))));
        $headers[$header] = $value;
    }
    return $headers;
}

$headers = getRequestHeaders();

foreach ($headers as $header => $value) {
    echo "$header: $value <br />\n";
}


यह भी देखें :
getallheaders () - (PHP> = 5.4) क्रॉस प्लेटफॉर्म संस्करण apache_request_headers() apache_response_headers () का उपनाम - सभी HTTP प्रतिसाद शीर्ष लेख प्राप्त करें।
हेडर_लिस्ट () - भेजे जाने वाले हेडर की सूची प्राप्त करें।


3
मुझे लगता है कि यह केवल अपाचे सर्वर का उपयोग करते समय ... ओपी को यह बताने की आवश्यकता हो सकती है कि :)
एलेक्स

12
मुझे 82% शौकीनों की परवाह नहीं है। मुझे पेशेवर प्रतिष्ठानों की परवाह है। मन की सही स्थिति में कोई भी mod_php पर उच्च यातायात साइट चलाने की कोशिश नहीं करेगा।
vartec

11
@ तंबाकू हां, और मुझे लगता है कि डाउनवॉटिंग का एक सही कारण है। किसी भी समय सबसे अच्छे उत्तर को उखाड़ा जाना चाहिए और खराब उत्तरों को नीचे उतारा जाना चाहिए। यह ऐतिहासिक समाधानों की एक साइट नहीं है :-)
थॉमस जेन्सेन

3
@ThomasJensen पर विचार करें, कि कुछ अन्य या सभी हेडर में इंटरसेस्ट हो सकते हैं और 'HTTP_X_REQUESTED_WITH' में निबंधात्मक रूप से नहीं; उत्तर सही है और जैको ने स्पष्ट रूप से कहा कि यह केवल अपाचे के लिए काम करता है; कुछ परिदृश्यों में यह सबसे अच्छा / सबसे अच्छा समाधान नहीं है क्योंकि यह एक खराब आइएमओ का कारण नहीं है।
सेबस्टियन हॉफमैन

1
@Paranaix A: मुझे नहीं पता कि आपका क्या मतलब है, मैंने उत्तर की हद तक आलोचना नहीं की है और आपका तर्क बिल्कुल वैसा ही है क्योंकि मैंने विशिष्ट प्रश्न का उत्तर देकर अपना जवाब शुरू किया और फिर अधिक सामान्य ज्ञान और अधिक जानकारी के लिए लिंक के साथ विस्तार से बताया । B: मुझे अभी भी नहीं लगता कि आपको apache_request_headers () के उपयोग को प्रोत्साहित करना चाहिए। इस प्रश्न को ढूंढने वाले न्यूबीज़ इसका उपयोग करना शुरू कर देंगे जो बेहतर कार्य मौजूद होने पर शर्म की बात है।
थॉमस जेन्सेन

371
$_SERVER['HTTP_X_REQUESTED_WITH']

RFC3875 , 4.1.18:

मेटा-वैरिएबल जिनके नाम की शुरुआत होती है HTTP_उनमें क्लाइंट रिक्वेस्ट हेडर फील्ड से पढ़े जाने वाले वैल्यू होते हैं, अगर प्रोटोकॉल HTTP का इस्तेमाल किया जाता है। HTTP हेडर फ़ील्ड नाम अपर केस में बदल जाती है, की सभी घटनाओं की है -के साथ बदल दिया _गया है और HTTP_मेटा-चर नाम देने के लिए prepended।


6
क्या मैं किसी भी सर्वर से हर हेडर को $_SERVERवेरिएबल में डालने की उम्मीद कर सकता हूं ? PHP प्रलेखन php.net/manual/en/reserved.variables.server.php के बारे में स्पष्ट है कि हम इसमें क्या हो सकते हैं।
मार्क अमेरी

4
यह (हमेशा) काम नहीं करेगा, खासकर PHP-fpm (या cgi) में। यह शीर्ष लेख हमेशा PHP के भीतर से उपलब्ध नहीं है।
ग्लेन प्लास

इस समाधान का उपयोग करके मैं केवल कुछ अनुरोध हेडर देख रहा हूं, और इस मामले में, मुझे वह नहीं दिख रहा है जो मैं चाहता हूं। क्रोम एक cache-controlहेडर भेज रहा है, लेकिन मैं इसे कहीं भी नहीं देखता हूं $_SERVER। मुझे HTTP_"HTTP_ACCEPT", और "HTTP_UPGRADE_INSECURE_REQUESTS" और "HTTP_USER_AGENT" (कई अन्य लोगों के साथ) सहित कई शीर्ष लेख दिखाई देते हैं । लेकिन "कैश-कंट्रोल" के लिए कुछ भी नहीं "प्रगमा" के लिए कुछ भी नहीं है। यह मामला या HTTP_उपसर्ग की परवाह किए बिना है । क्या मैं कुछ भूल रहा हूँ?
इवान डे ला क्रूज़

@ एवेंडेला क्रुज़: leserged.online.fr/phpinfo.php मैं इसे यहाँ देख रहा हूँ:_SERVER["HTTP_CACHE_CONTROL"] max-age=0
क्वासोनी

हम्म्म, धन्यवाद ... यह मेरे नम देव सर्वर पर है और मुझे लगता है कि PHP एक अपाचे मॉड्यूल के रूप में चल रहा है, लेकिन मुझे यकीन नहीं है। मुझे एफपीएम के साथ मेरे प्रोडक्ट बॉक्स पर जांच करने दें और देखें कि क्या मैं यह पता लगा सकता हूं कि मैं इसे यहां क्यों नहीं देख रहा हूं ...
इवान डे ला क्रूज़

48

आपको $_SERVERवैश्विक HTTP में सभी HTTP हेडर को HTTP_अपरकेस के साथ उपसर्ग और डैश के साथ (-) underscores (_) द्वारा प्रतिस्थापित करना चाहिए।

उदाहरण के लिए X-Requested-Withआप में पाया जा सकता है:

$_SERVER['HTTP_X_REQUESTED_WITH']

यह $_SERVERचर से एक साहचर्य सरणी बनाने के लिए सुविधाजनक हो सकता है । यह कई शैलियों में किया जा सकता है, लेकिन यहां एक फ़ंक्शन है जो ऊंट की चाबी का उत्पादन करता है:

$headers = array();
foreach ($_SERVER as $key => $value) {
    if (strpos($key, 'HTTP_') === 0) {
        $headers[str_replace(' ', '', ucwords(str_replace('_', ' ', strtolower(substr($key, 5)))))] = $value;
    }
}

अब बस $headers['XRequestedWith']वांछित हेडर को पुनः प्राप्त करने के लिए उपयोग करें।

PHP मैनुअल ऑन $_SERVER: http://php.net/manual/en/reserved.variables.server.php


3
मेरी राय में, सबसे अच्छा जवाब, थॉमस का क्वासोई के अंतिम परिणाम के साथ स्पष्टीकरण है। एक साहचर्य सरणी आमतौर पर क्या जरूरत नहीं है, और यह parseRequestHeaders()फ़ंक्शन को पढ़ने से सरल समाधान को हल करने के लिए बहुत आसान नहीं है । यदि इस तरह के साहचर्य सरणी की आवश्यकता होती है, तो IMO एपाचे फ़ंक्शन सबसे अच्छा विकल्प है, क्योंकि यह एक कैमलकेस संस्करण के बजाय प्राप्त हेडर को बिल्कुल वापस करता है। (यह भी ध्यान दें कि PHP 5.4 के रूप में, यह अब केवल अपाचे नहीं है।)
ब्रिलियनड

क्या आपने इस 2 साल और 11 महीने का उत्तर दिया है, इस उत्तर में 200+ अपवोट होंगे।
डिवाइडबिजेरो

apache_request_headers()या getallheaders()जब मैंने परीक्षण किया हैडर के नामों को कैपिटल में नहीं लगता है। वे ठीक वैसे ही लौट रहे हैं जैसे मैं ग्राहक की तरफ से गुजरता हूं। फिर आप इस तरह के प्रतिस्थापन कार्य में हेडर नामों को कैपिटल में क्यों ला रहे हैं?
रिनेज़

22

PHP 5.4.0 के बाद से आप getallheadersफ़ंक्शन का उपयोग कर सकते हैं जो सभी अनुरोध हेडर को एक सहयोगी सरणी के रूप में लौटाता है:

var_dump(getallheaders());

// array(8) {
//   ["Accept"]=>
//   string(63) "text/html[...]"
//   ["Accept-Charset"]=>
//   string(31) "ISSO-8859-1[...]"
//   ["Accept-Encoding"]=>
//   string(17) "gzip,deflate,sdch"
//   ["Accept-Language"]=>
//   string(14) "en-US,en;q=0.8"
//   ["Cache-Control"]=>
//   string(9) "max-age=0"
//   ["Connection"]=>
//   string(10) "keep-alive"
//   ["Host"]=>
//   string(9) "localhost"
//   ["User-Agent"]=>
//   string(108) "Mozilla/5.0 (Windows NT 6.1; WOW64) [...]"
// }

इससे पहले यह फ़ंक्शन केवल तभी काम करता था जब PHP एक Apache / NSAPI मॉड्यूल के रूप में चल रहा था।


20
मैं इसे PHP-FPM 5.5 और NGINX पर उपयोग कर रहा हूं। getallheaders () मौजूद नहीं है।
CMCDragonkai 3

FPM में @CMCDragonkai आपको शीर्ष लेख की जानकारी कैसे मिली?
अजीत सिंह

5

strtolowerप्रस्तावित समाधानों में से कई में कमी है, RFC2616 (HTTP / 1.1) हेडर फ़ील्ड्स को केस-असंवेदनशील संस्थाओं के रूप में परिभाषित करता है। पूरी बात, सिर्फ मूल्य भाग नहीं।

इसलिए केवल HTTP_ प्रविष्टियाँ पार्स करने जैसे सुझाव गलत हैं।

इस तरह होगा बेहतर:

if (!function_exists('getallheaders')) {
    foreach ($_SERVER as $name => $value) {
        /* RFC2616 (HTTP/1.1) defines header fields as case-insensitive entities. */
        if (strtolower(substr($name, 0, 5)) == 'http_') {
            $headers[str_replace(' ', '-', ucwords(strtolower(str_replace('_', ' ', substr($name, 5)))))] = $value;
        }
    }
    $this->request_headers = $headers;
} else {
    $this->request_headers = getallheaders();
}

पिछले सुझावों के साथ सूक्ष्म अंतर पर ध्यान दें। यहाँ फ़ंक्शन php-fpm (+ nginx) पर भी काम करता है।


1
आरएफसी 2616 कहाँ कहता है कि क्षेत्र मान केस-असंवेदनशील हैं? यह स्पष्ट रूप से बताता है कि "HTTP-date केस संवेदी है" - और यह Dateहेडर में जाता है - और यह कि "पैरामीटर मान [सामग्री-प्रकार में पाठ के बाद अर्धविराम] हो सकता है या केस-संवेदी नहीं हो सकता है"। इसलिए दिए गए केस-संवेदी मूल्यों के साथ कम से कम दो हेडर हैं, ऐसा लगता है कि आप गलत हैं।
जोकर_vD

HTTP header fields, which include general-header (section 4.5), request-header (section 5.3), response-header (section 6.2), and entity-header (section 7.1) fields, follow the same generic format as that given in Section 3.1 of RFC 822 [9]. Each header field consists of a name followed by a colon (":") and the field value. Field names are case-insensitive. इसलिए मुझे लगता है कि आप गलत हैं।
ग्लेन प्लास

4
फ़ील्ड नाम केस-असंवेदनशील हैं। इस पैराग्राफ में फ़ील्ड मानों के बारे में कुछ भी नहीं है , जबकि दस्तावेज़ के अन्य भाग स्पष्ट रूप से केस-संवेदी फ़ील्ड मानों के बारे में बताते हैं।
जोकर_vD

1
क्यों फिर सभी अंतरिक्ष की जगह फिर पानी का छींटा के लिए जगह? यह सिर्फ काम नहीं करेगा: $ हेडर [ucwords (स्ट्रेटोलॉवर (पदार्थ ($ नाम, 5)))] = $ मूल्य; ?
तिमिरबेक

5

forलूप का उपयोग किए बिना इसका मान प्राप्त करने के लिए इस फ़ंक्शन को हेडर नाम दें । हेडर नहीं मिलने पर अशक्त हो जाता है।

/**
 * @var string $headerName case insensitive header name
 *
 * @return string|null header value or null if not found
 */
function get_header($headerName)
{
    $headers = getallheaders();
    return isset($headerName) ? $headers[$headerName] : null;
}

नोट: यह केवल अपाचे सर्वर के साथ काम करता है, देखें: http://php.net/manual/en/function.getallheaders.np

नोट: यह फ़ंक्शन प्रोसेस करेगा और सभी हेडर को मेमोरी में लोड करेगा और यह forलूप की तुलना में कम परफॉर्म करेगा।


फ़ंक्शन में त्रुटि है, $ pHeaderKey को $ शीर्ष लेख में बदलें
Tegos

4

चीजों को सरल बनाने के लिए, यहां बताया गया है कि आप केवल वह ही प्राप्त कर सकते हैं जो आप चाहते हैं:

सरल:

$headerValue = $_SERVER['HTTP_X_REQUESTED_WITH'];

या जब आपको एक बार में एक प्राप्त करने की आवश्यकता हो:

<?php
/**
 * @param $pHeaderKey
 * @return mixed
 */
function get_header( $pHeaderKey )
{
    // Expanded for clarity.
    $headerKey = str_replace('-', '_', $pHeaderKey);
    $headerKey = strtoupper($headerKey);
    $headerValue = NULL;
    // Uncomment the if when you do not want to throw an undefined index error.
    // I leave it out because I like my app to tell me when it can't find something I expect.
    //if ( array_key_exists($headerKey, $_SERVER) ) {
    $headerValue = $_SERVER[ $headerKey ];
    //}
    return $headerValue;
}
// X-Requested-With mainly used to identify Ajax requests. Most JavaScript frameworks
// send this header with value of XMLHttpRequest, so this will not always be present.
$header_x_requested_with = get_header( 'X-Requested-With' );

अन्य शीर्ष लेख सुपर ग्लोबल एरे $ _SERVER में भी हैं, आप उनके बारे में यहां कैसे पढ़ सकते हैं: http://php.net/manual/en/reserved.variables.server.php


अन्य उत्तरों की तुलना में ऐसा लगता है कि आप कार्य नहीं करेंगे क्योंकि यह HTTP_$headerKey
पूर्व निर्धारित

3

मैं CodeIgniter का उपयोग कर रहा था और इसे प्राप्त करने के लिए नीचे दिए गए कोड का उपयोग किया। भविष्य में किसी के लिए उपयोगी हो सकता है।

$this->input->get_request_header('X-Requested-With');

ये था। के बारे में जानता था get_request_header () विधि, लेकिन यकीन नहीं था कि मैं हेडर नाम का उपयोग कर सकता हूं, अर्थात बिना हाइपरसेंस को बदलने के बिना।
Valkay

खुशी है कि यह मदद की। चीयर्स।
राजेश

1

यहाँ मैं यह कैसे कर रहा हूँ। अगर $ हैडर_नाम पास न हो तो आपको सभी शीर्षलेख प्राप्त करने होंगे:

<?php
function getHeaders($header_name=null)
{
    $keys=array_keys($_SERVER);

    if(is_null($header_name)) {
            $headers=preg_grep("/^HTTP_(.*)/si", $keys);
    } else {
            $header_name_safe=str_replace("-", "_", strtoupper(preg_quote($header_name)));
            $headers=preg_grep("/^HTTP_${header_name_safe}$/si", $keys);
    }

    foreach($headers as $header) {
            if(is_null($header_name)){
                    $headervals[substr($header, 5)]=$_SERVER[$header];
            } else {
                    return $_SERVER[$header];
            }
    }

    return $headervals;
}
print_r(getHeaders());
echo "\n\n".getHeaders("Accept-Language");
?>

अन्य उत्तरों में दिए गए अधिकांश उदाहरणों की तुलना में यह मुझे बहुत सरल लगता है। यह भी विधि (GET / POST / etc) प्राप्त करता है और URI अनुरोध करता है जब सभी हेडर प्राप्त किए जा सकते हैं जो उपयोगी हो सकते हैं यदि आप इसे लॉगिंग में उपयोग करने का प्रयास कर रहे हैं।

यहाँ उत्पादन है:

Array ( [HOST] => 127.0.0.1 [USER_AGENT] => Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:28.0) Gecko/20100101 Firefox/28.0 [ACCEPT] => text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 [ACCEPT_LANGUAGE] => en-US,en;q=0.5 [ACCEPT_ENCODING] => gzip, deflate [COOKIE] => PHPSESSID=MySessionCookieHere [CONNECTION] => keep-alive )

en-US,en;q=0.5

0

यहाँ यह करने के लिए एक आसान तरीका है।

// echo get_header('X-Requested-With');
function get_header($field) {
    $headers = headers_list();
    foreach ($headers as $header) {
        list($key, $value) = preg_split('/:\s*/', $header);
        if ($key == $field)
            return $value;
    }
}

है कि हेडर कि बाहर भेजा नहीं है?
CMCDragonkai

@CMCDragonkai नंबर "हेडर_लिस्ट () ब्राउज़र / क्लाइंट को भेजे जाने वाले हेडर की सूची लौटाएगा
kehit

2
हाँ। मेरा मतलब यही था।
CMCDragonkai

1
प्रश्न सर्वर पर भेजे गए हेडर के लिए पूछ रहा है। वे अनुरोध हेडर हैं।
CMCDragonkai

1
स्रोत और गंतव्य, जब "भेजे गए", "बाहर", "से", "से" जैसे शब्दों का उपयोग करते हैं, उस संदर्भ के सापेक्ष है जिसमें उन शब्दों का उपयोग किया जाता है। इस उत्तर में, उदाहरण से पता चलता है कि PHP सर्वर पर चल रहा है । और, ओपी के सवाल ने सर्वर-साइड PHP को भी संदर्भित किया। इसलिए, @CMCDragonkai और MichaelLeany सही हैं। यह एक बुरा जवाब है। "भेजा गया", इस संदर्भ में, "HTTP प्रतिक्रिया हेडर सर्वर से भेजे गए" का अर्थ है। कीहर्स क्लाइंट के पॉइंट-ऑफ-व्यू से टिप्पणी कर रहे हैं, लेकिन उनका जवाब और ओपी का सवाल सर्वर के दृष्टिकोण से है।
इवान डे ला क्रूज़

0

यह छोटा सा PHP स्निपेट आपके लिए मददगार हो सकता है:

<?php
foreach($_SERVER as $key => $value){
echo '$_SERVER["'.$key.'"] = '.$value."<br />";
}
?>

0
function getCustomHeaders()
{
    $headers = array();
    foreach($_SERVER as $key => $value)
    {
        if(preg_match("/^HTTP_X_/", $key))
            $headers[$key] = $value;
    }
    return $headers;
}

मैं इस फ़ंक्शन का उपयोग कस्टम हेडर प्राप्त करने के लिए करता हूं, अगर हेडर "HTTP_X_" से शुरू होता है, तो हम सरणी में धकेलते हैं :)


0

यदि केवल एक कुंजी को पुनः प्राप्त करना आवश्यक है, उदाहरण के लिए "Host"पते की आवश्यकता है, तो हम उपयोग कर सकते हैं

apache_request_headers()['Host']

ताकि हम लूप से बच सकें और इको आउटपुट को इनलाइन कर सकें


PHP 5.4 से शुरू। 5.3 में, यह सिंटैक्स त्रुटि पैदा करेगा।
रॉबिन के


0

PHP 7: नल कोलेसस ऑपरेटर

//$http = 'SCRIPT_NAME';
$http = 'X_REQUESTED_WITH';
$http = strtoupper($http);
$header = $_SERVER['HTTP_'.$http] ?? $_SERVER[$http] ?? NULL;

if(is_null($header)){
    die($http. ' Not Found');
}
echo $header;

-1

यदि आपके पास अपाचे सर्वर है तो यह काम करता है

PHP कोड:

$headers = apache_request_headers();

foreach ($headers as $header => $value) {
    echo "$header: $value <br />\n";
}

परिणाम:

Accept: */*
Accept-Language: en-us
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0
Host: www.example.com
Connection: Keep-Alive
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.