Respuestas:
SI : solo necesita un solo 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 : ejecuta PHP como un módulo de Apache o, a partir de PHP 5.4, utilizando FastCGI (método simple):
<?php
$headers = apache_request_headers();
foreach ($headers as $header => $value) {
echo "$header: $value <br />\n";
}
ELSE: En cualquier otro caso, puede 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";
}
Consulte también :
getallheaders () - (PHP> = 5.4) edición multiplataforma Alias de apache_request_headers()
apache_response_headers () - Obtenga todos los encabezados de respuesta HTTP.
headers_list () - Obtiene una lista de encabezados para enviar.
$_SERVER['HTTP_X_REQUESTED_WITH']
RFC3875 , 4.1.18:
Las metavariables 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 en mayúsculas, se-
reemplaza por todas las apariciones_
y seHTTP_
antepone para dar el nombre de la meta-variable.
$_SERVER
variable? La documentación de PHP en php.net/manual/en/reserved.variables.server.php es evasiva sobre lo que podemos estar seguros de que estará allí.
cache-control
encabezado, pero no lo veo en ningún lado $_SERVER
. Veo varios encabezados con el prefijo HTTP_
, incluidos "HTTP_ACCEPT", y "HTTP_UPGRADE_INSECURE_REQUESTS" y "HTTP_USER_AGENT" (entre otros). Pero nada para "control de caché" tampoco para "pragma". Esto es independientemente del caso o HTTP_
prefijo. ¿Me estoy perdiendo de algo?
_SERVER["HTTP_CACHE_CONTROL"] max-age=0
Debería encontrar todos los encabezados HTTP en la $_SERVER
variable global con el prefijo en HTTP_
mayúsculas y con guiones (-) reemplazados por guiones bajos (_).
Por ejemplo, X-Requested-With
se puede encontrar en:
$_SERVER['HTTP_X_REQUESTED_WITH']
Puede ser conveniente crear una matriz asociativa a partir de la $_SERVER
variable. Esto se puede hacer en varios estilos, pero aquí hay una función que genera teclas en camello:
$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
: http://php.net/manual/en/reserved.variables.server.php
parseRequestHeaders()
función. Si se necesita dicha matriz asociativa, entonces IMO la función apache es la mejor opción, ya que devuelve exactamente los encabezados recibidos en lugar de una versión de CamelCase destrozada. (También tenga en cuenta que a partir de PHP 5.4, ya no es solo Apache.)
apache_request_headers()
o getallheaders()
no parece poner en mayúscula los nombres de encabezado cuando lo probé. Están regresando exactamente cuando paso del lado del cliente. Entonces, ¿por qué está capitalizando los nombres de encabezado en una función de reemplazo?
Desde PHP 5.4.0 puede usar la getallheaders
función que devuelve todos los encabezados de solicitud 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.
strtolower
falta en 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, no solo la parte del valor .
Por lo tanto, sugerencias como solo analizar 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();
}
Observe las diferencias sutiles con las sugerencias anteriores. La función aquí también funciona en php-fpm (+ nginx).
Date
encabezado, y que "los valores de los parámetros [texto en Tipo de contenido después del punto y coma] pueden o no distinguen entre mayúsculas y minúsculas". Entonces, dado que hay al menos dos encabezados con valores que distinguen entre mayúsculas y minúsculas, parece que estás equivocado.
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.
Entonces supongo que te equivocas.
Pase un nombre de encabezado a esta función para obtener su valor sin usar el 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, consulte: http://php.net/manual/en/function.getallheaders.php
Nota: esta función procesará y cargará todos los encabezados en la memoria y es menos eficaz que un for
bucle.
Para simplificar las cosas, así es como puede obtener lo 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 acerca de cómo obtenerlos aquí: http://php.net/manual/en/reserved.variables.server.php
HTTP_
a la$headerKey
Estaba usando CodeIgniter y usé el siguiente código para obtenerlo. Puede ser útil para alguien en el futuro.
$this->input->get_request_header('X-Requested-With');
Así es como lo estoy haciendo. Debe 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 que pueden ser útiles si está tratando de usarlo en el registro.
Aquí está el resultado:
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
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;
}
}
Este pequeño fragmento de PHP puede serle útil:
<?php
foreach($_SERVER as $key => $value){
echo '$_SERVER["'.$key.'"] = '.$value."<br />";
}
?>
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 comienza desde "HTTP_X_", insertamos la matriz :)
si solo se requiere una clave para recuperarla, por ejemplo "Host"
, se requiere una dirección, entonces podemos usar
apache_request_headers()['Host']
Para que podamos evitar bucles y ponerlo en línea a las salidas de eco
Esto funciona 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