Как читать заголовок в PHP?
Например, пользовательский заголовок: X-Requested-With
.
ЕСЛИ : вам нужен только один заголовок, а не все заголовки, самый быстрый способ:
<?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 : вы запускаете PHP как модуль Apache или, как и PHP 5.4, используя FastCGI (простой метод):
apache_request_headers ()
<?php $headers = apache_request_headers(); foreach ($headers as $header => $value) { echo "$header: $value <br />\n"; }
ELSE: В любом другом случае вы можете использовать (пользовательскую реализацию):
<?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-заголовков ответов.
headers_list () – выбор списка заголовков для отправки.
$_SERVER['HTTP_X_REQUESTED_WITH']
RFC3875 , 4.1.18:
Мета-переменные с именами, начинающимися с
HTTP_
содержат значения, считанные из полей заголовка запроса клиента, если используется протокол HTTP. Имя поля заголовка HTTP преобразуется в верхний регистр, имеет все вхождения-
заменено на_
и имеетHTTP_
чтобы присвоить имя мета-переменной.
Вы должны найти все HTTP-заголовки в глобальной переменной $_SERVER
префиксом HTTP_
и дефисами (-) заменяться HTTP_
подчеркивания (_).
Например, ваш 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
Начиная с 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.
В некоторых предлагаемых решениях 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).
Передайте ключ заголовка, эта функция вернет свое значение, вы можете получить значение заголовка без использования цикла for
function get_header( $headerKey ) { $test = getallheaders(); if ( array_key_exists($headerKey, $test) ) { $headerValue = $test[ $headerKey ]; } return $headerValue; }
Чтобы все было просто, вот как вы можете получить только тот, который вам нужен:
Просто:
$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
Вот как я это делаю. Вам нужно получить все заголовки, если $ header_name не передано:
<?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
Вот простой способ сделать это.
// 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; } }
function getCustomHeaders() { $headers = array(); foreach($_SERVER as $key => $value) { if(preg_match("/^HTTP_X_/", $key)) $headers[$key] = $value; } return $headers; }
Я использую эту функцию для получения пользовательских заголовков, если заголовок начинается с «HTTP_X_», мы вставляем массив 🙂
Я использовал CodeIgniter и использовал код ниже, чтобы получить его. Может быть полезным для кого-то в будущем.
$this->input->get_request_header('X-Requested-With');
Этот небольшой фрагмент PHP может быть вам полезен:
<?php foreach($_SERVER as $key => $value){ echo '$_SERVER["'.$key.'"] = '.$value."<br />"; } ?>