obtener - php print headers received
¿Cómo leo cualquier encabezado de solicitud en PHP? (14)
¿Cómo debo leer cualquier encabezado en PHP?
Por ejemplo, el encabezado personalizado: X-Requested-With
.
Aquí hay una manera fácil de hacerlo.
// 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;
}
}
Así es como lo estoy haciendo. Necesitas obtener todos los encabezados si no se pasa $ 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");
?>
Me parece mucho más simple que la mayoría de los ejemplos dados en otras respuestas. Esto también obtiene el método (GET / POST / etc.) Y el URI solicitado al obtener todos los encabezados, lo que puede ser útil si está intentando usarlo en el registro.
Aquí está la salida:
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
Debería encontrar todos los encabezados HTTP en la variable global $_SERVER
con el prefijo HTTP_
y con guiones (-) reemplazados por guiones bajos (_).
Por ejemplo, su X-Requested-With
se puede encontrar en:
$_SERVER[''HTTP_X_REQUESTED_WITH'']
Podría ser conveniente crear una matriz asociativa a partir de la variable $_SERVER
. Esto se puede hacer en varios estilos, pero aquí hay una función que genera claves camelcased:
$headers = array();
foreach ($_SERVER as $key => $value) {
if (strpos($key, ''HTTP_'') === 0) {
$headers[str_replace('' '', '''', ucwords(str_replace(''_'', '' '', strtolower(substr($key, 5)))))] = $value;
}
}
Ahora solo use $headers[''XRequestedWith'']
para recuperar el encabezado deseado.
Manual de PHP en $_SERVER
: php.net/manual/en/reserved.variables.server.php
Desde PHP 5.4.0 puede usar la función getallheaders() que devuelve todos los encabezados solicitados como una matriz asociativa:
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) [...]"
// }
Anteriormente, esta función solo funcionaba cuando PHP se ejecutaba como un módulo Apache / NSAPI.
Estaba usando CodeIgniter y usé el código de abajo para obtenerlo. Puede ser útil para alguien en el futuro.
$this->input->get_request_header(''X-Requested-With'');
Este pequeño fragmento de código PHP puede ser útil para usted:
<?php
foreach($_SERVER as $key => $value){
echo ''$_SERVER["''.$key.''"] = ''.$value."<br />";
}
?>
Este trabajo si tienes un servidor Apache
Código PHP:
$headers = apache_request_headers();
foreach ($headers as $header => $value) {
echo "$header: $value <br />/n";
}
Resultado:
Accept: */*
Accept-Language: en-us
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0
Host: www.example.com
Connection: Keep-Alive
Para simplificar las cosas, a continuación le indicamos cómo puede obtener exactamente la que desea:
Sencillo:
$headerValue = $_SERVER[''HTTP_X_REQUESTED_WITH''];
o cuando necesita obtener uno a la vez:
<?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'' );
Los otros encabezados también están en la matriz súper global $ _SERVER, puede leer sobre cómo llegar a ellos aquí: php.net/manual/en/reserved.variables.server.php
Pase un nombre de encabezado a esta función para obtener su valor sin usar for
bucle. Devuelve nulo si no se encuentra el encabezado.
/**
* @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;
}
Nota: esto solo funciona con el servidor Apache, ver: getallheaders()
Nota: esta función procesará y cargará todos los encabezados a la memoria y es menos eficaz que un bucle for
.
si solo se necesita una clave para recuperarla, por ejemplo, se requiere la dirección "Host"
, entonces podemos usar
apache_request_headers()[''Host'']
Para que podamos evitar los bucles y ponerlo en línea con las salidas de eco.
strtolower
carece de varias de las soluciones propuestas, RFC2616 (HTTP / 1.1) define los campos de encabezado como entidades que no distinguen entre mayúsculas y minúsculas. Todo el asunto, no solo la parte del valor .
Por lo tanto, sugerencias como el análisis de entradas HTTP_ son incorrectas.
Mejor sería así:
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();
}
Note las sutiles diferencias con las sugerencias anteriores. La función aquí también funciona en php-fpm (+ nginx).
SI : solo necesita un único encabezado, en lugar de todos los encabezados, el método más rápido es:
<?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 : ejecutas PHP como un módulo de Apache o, a partir de PHP 5.4, usando FastCGI (método simple):
<?php
$headers = apache_request_headers();
foreach ($headers as $header => $value) {
echo "$header: $value <br />/n";
}
ELSE: En cualquier otro caso, puedes usar (implementación de usuario):
<?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";
}
Ver también :
getallheaders() - (PHP> = 5.4) edición de plataforma Alias de apache_request_headers()
apache_response_headers() - Recupera todos los encabezados de respuesta HTTP.
headers_list() - headers_list() una lista de los encabezados que se enviarán.
$_SERVER[''HTTP_X_REQUESTED_WITH'']
RFC3875 , 4.1.18:
Las meta-variables con nombres que comienzan con
HTTP_
contienen valores leídos de los campos de encabezado de solicitud del cliente, si el protocolo utilizado es HTTP. El nombre del campo del encabezado HTTP se convierte a mayúsculas, tiene todas las apariciones de-
reemplazado con_
y se haHTTP_
para dar el nombre de la meta-variable.
function getCustomHeaders()
{
$headers = array();
foreach($_SERVER as $key => $value)
{
if(preg_match("/^HTTP_X_/", $key))
$headers[$key] = $value;
}
return $headers;
}
Utilizo esta función para obtener los encabezados personalizados, si el encabezado se inicia desde "HTTP_X_" empujamos la matriz :)