validate received print obtener headers get_header from capturar php http-headers

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):

apache_request_headers()

<?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 ha HTTP_ 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 :)