[Solved] How do I read any request header in PHP

How should I read any header in PHP?

For example the custom header: X-Requested-With.

Enquirer: Sabya


Solution #1:

IF: you only need a single header, instead of all headers, the quickest method is:

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

ELSE IF: you run PHP as an Apache module or, as of PHP 5.4, using FastCGI (simple method):


$headers = apache_request_headers();

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

ELSE: In any other case, you can use (userland implementation):

function getRequestHeaders() {
    $headers = array();
    foreach($_SERVER as $key => $value) {
        if (substr($key, 0, 5) <> 'HTTP_') {
        $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";

See Also:
getallheaders() – (PHP >= 5.4) cross platform edition Alias of apache_request_headers()
apache_response_headers() – Fetch all HTTP response headers.
headers_list() – Fetch a list of headers to be sent.

Respondent: Jacco

Solution #2:


RFC3875, 4.1.18:

Meta-variables with names beginning with HTTP_ contain values read from the client request header fields, if the protocol used is HTTP. The HTTP header field name is converted to upper case, has all occurrences of - replaced with _ and has HTTP_ prepended to give the meta-variable name.

Respondent: Quassnoi

Solution #3:

You should find all HTTP headers in the $_SERVER global variable prefixed with HTTP_ uppercased and with dashes (-) replaced by underscores (_).

For instance your X-Requested-With can be found in:


It might be convenient to create an associative array from the $_SERVER variable. This can be done in several styles, but here’s a function that outputs camelcased keys:

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

Now just use $headers['XRequestedWith'] to retrieve the desired header.

PHP manual on $_SERVER:

Respondent: Thomas Jensen

Solution #4:

Since PHP 5.4.0 you can use getallheaders function which returns all request headers as an associative array:


// 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) [...]"
// }

Earlier this function worked only when PHP was running as an Apache/NSAPI module.

Respondent: Salman A

Solution #5:

strtolower is lacking in several of the proposed solutions, RFC2616 (HTTP/1.1) defines header fields as case-insensitive entities. The whole thing, not just the value part.

So suggestions like only parsing HTTP_ entries are wrong.

Better would be like this:

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();

Notice the subtle differences with previous suggestions. The function here also works on php-fpm (+nginx).

Respondent: Glenn Plas

Solution #6:

I was using CodeIgniter and used the code below to get it. May be useful for someone in future.

Respondent: Rajesh

Solution #7:

Pass a header name to this function to get its value without using for loop. Returns null if header not found.

 * @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;

Note: this works only with Apache server, see:

Note: this function will process and load all of the headers to the memory and it’s less performant than a for loop.

Respondent: Milap Kundalia

Solution #8:

To make things simple, here is how you can get just the one you want:



or when you need to get one at a time:

 * @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' );

The other headers are also in the super global array $_SERVER, you can read about how to get at them here:

Respondent: b01

Solution #9:

Here’s how I’m doing it. You need to get all headers if $header_name isn’t passed:

function getHeaders($header_name=null)

    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) {
                    $headervals[substr($header, 5)]=$_SERVER[$header];
            } else {
                    return $_SERVER[$header];

    return $headervals;
echo "nn".getHeaders("Accept-Language");

It looks a lot simpler to me than most of the examples given in other answers. This also gets the method (GET/POST/etc.) and the URI requested when getting all of the headers which can be useful if you’re trying to use it in logging.

Here’s the output:

Array ( [HOST] => [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 )

Respondent: Jonnycake

Solution #10:

PHP 7: Null Coalesce Operator

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

    die($http. ' Not Found');
echo $header;
Respondent: Scaffold

Solution #11:

Here is an easy way to do it.

// 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;
Respondent: kehers

Solution #12:

This small PHP snippet can be helpful to you:

foreach($_SERVER as $key => $value){
echo '$_SERVER["'.$key.'"] = '.$value."<br />";
Respondent: Technolust

Solution #13:

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

I use this function to get the custom headers, if the header starts from “HTTP_X_” we push in the array 🙂

Respondent: ZiTAL

Solution #14:

if only one key is required to retrieved, For example "Host" address is required, then we can use


So that we can avoid loops and put it inline to the echo outputs

Respondent: Dickens A S

Solution #15:

This work if you have an Apache server

PHP Code:

$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
Connection: Keep-Alive
Respondent: Emanuel Nogueiras

The answers/resolutions are collected from stackoverflow, are licensed under cc by-sa 2.5 , cc by-sa 3.0 and cc by-sa 4.0 .

Most Popular

To Top
India and Pakistan’s steroid-soaked rhetoric over Kashmir will come back to haunt them both clenbuterol australia bossier man pleads guilty for leadership role in anabolic steriod distribution conspiracy