Respostas:
IF : você só precisa de um único cabeçalho, em vez de todos os cabeçalhos, o método mais rápido é:
<?php
// Replace XXXXXX_XXXX with the name of the header you need in UPPERCASE (and with '-' replaced by '_')
$headerStringValue = $_SERVER['HTTP_XXXXXX_XXXX'];
ELSE SE : você executa o PHP como um módulo Apache ou, a partir do PHP 5.4, usando o FastCGI (método simples):
<?php
$headers = apache_request_headers();
foreach ($headers as $header => $value) {
echo "$header: $value <br />\n";
}
ELSE: Em qualquer outro caso, você pode usar (implementação da terra do usuário):
<?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 também :
getallheaders () - (PHP> = 5.4) edição entre plataformas Alias de apache_request_headers()
apache_response_headers () - Busque todos os cabeçalhos de resposta HTTP.
headers_list () - Busca uma lista de cabeçalhos a serem enviados.
$_SERVER['HTTP_X_REQUESTED_WITH']
RFC3875 , 4.1.18:
Meta-variáveis com nomes começando com
HTTP_
contêm valores lidos nos campos de cabeçalho da solicitação do cliente, se o protocolo usado for HTTP. O nome do campo do cabeçalho HTTP é convertido para maiúsculas, possui todas as ocorrências-
substituídas_
e foiHTTP_
anexado para fornecer o nome da metavariável.
$_SERVER
variável? A documentação do PHP em php.net/manual/en/reserved.variables.server.php é evasiva sobre o que podemos ter certeza de que estará lá.
cache-control
cabeçalho, mas não o vejo em nenhum lugar $_SERVER
. Eu vejo vários cabeçalhos prefixados HTTP_
, incluindo "HTTP_ACCEPT" e "HTTP_UPGRADE_INSECURE_REQUESTS" e "HTTP_USER_AGENT" (entre vários outros). Mas nada para "controle de cache" também nada para "pragma". Isso é independente do caso ou HTTP_
prefixo. Estou esquecendo de algo?
_SERVER["HTTP_CACHE_CONTROL"] max-age=0
Você deve encontrar todos os cabeçalhos HTTP na $_SERVER
variável global prefixada com HTTP_
maiúsculas e com traços (-) substituídos por sublinhados (_).
Por exemplo, você X-Requested-With
pode ser encontrado em:
$_SERVER['HTTP_X_REQUESTED_WITH']
Pode ser conveniente criar uma matriz associativa a partir da $_SERVER
variável Isso pode ser feito em vários estilos, mas aqui está uma função que gera teclas com camelcased:
$headers = array();
foreach ($_SERVER as $key => $value) {
if (strpos($key, 'HTTP_') === 0) {
$headers[str_replace(' ', '', ucwords(str_replace('_', ' ', strtolower(substr($key, 5)))))] = $value;
}
}
Agora basta usar $headers['XRequestedWith']
para recuperar o cabeçalho desejado.
Manual do PHP em $_SERVER
: http://php.net/manual/en/reserved.variables.server.php
parseRequestHeaders()
função. Se for necessária uma matriz associativa, a função apache da IMO é a melhor opção, pois retorna exatamente os cabeçalhos recebidos em vez de uma versão CamelCase mutilada. (De referir ainda que a partir do PHP 5.4, já não Apache somente é.)
apache_request_headers()
ou getallheaders()
não parece colocar em maiúscula os nomes dos cabeçalhos quando testei. Eles estão retornando exatamente como eu passo do lado do cliente. Então, por que você está capitalizando nomes de cabeçalho em uma função de substituição?
Desde o PHP 5.4.0 você pode usar a getallheaders
função que retorna todos os cabeçalhos de solicitação como uma matriz associativa:
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, essa função funcionava apenas quando o PHP estava sendo executado como um módulo Apache / NSAPI.
strtolower
Na falta de várias soluções propostas, o RFC2616 (HTTP / 1.1) define os campos de cabeçalho como entidades que não diferenciam maiúsculas de minúsculas. A coisa toda, não apenas o valor parte .
Então, sugestões como apenas analisar HTTP_ entradas estão erradas.
Melhor seria assim:
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 as diferenças sutis com sugestões anteriores. A função aqui também funciona em php-fpm (+ nginx).
Date
cabeçalho - e que "os valores de parâmetro [texto em Tipo de conteúdo após ponto e vírgula] podem ou não diferenciar maiúsculas de minúsculas". Portanto, considerando que há pelo menos dois cabeçalhos com valores que diferenciam maiúsculas de minúsculas, parece que você está errado.
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.
Então eu acho que você está errado.
Passe um nome de cabeçalho para esta função para obter seu valor sem usar o for
loop. Retorna nulo se o cabeçalho não for encontrado.
/**
* @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: isso funciona apenas com o servidor Apache, consulte: http://php.net/manual/en/function.getallheaders.php
Nota: esta função processará e carregará todos os cabeçalhos na memória e terá menos desempenho do que um for
loop.
Para simplificar, eis como você pode obter exatamente o que deseja:
Simples:
$headerValue = $_SERVER['HTTP_X_REQUESTED_WITH'];
ou quando você precisar obter um de cada 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' );
Os outros cabeçalhos também estão na matriz super global $ _SERVER, você pode ler sobre como acessá-los aqui: http://php.net/manual/en/reserved.variables.server.php
HTTP_
$headerKey
Eu estava usando o CodeIgniter e usei o código abaixo para obtê-lo. Pode ser útil para alguém no futuro.
$this->input->get_request_header('X-Requested-With');
Aqui está como eu estou fazendo isso. Você precisa obter todos os cabeçalhos se $ header_name não for passado:
<?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");
?>
Parece-me muito mais simples do que a maioria dos exemplos dados em outras respostas. Isso também obtém o método (GET / POST / etc.) E o URI solicitado ao obter todos os cabeçalhos que podem ser úteis se você estiver tentando usá-lo no log.
Aqui está a saída:
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
Aqui está uma maneira fácil de fazer isso.
// 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 pequeno trecho de PHP pode ser útil para você:
<?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;
}
Eu uso essa função para obter os cabeçalhos personalizados, se o cabeçalho começa em "HTTP_X_", pressionamos a matriz :)
se apenas uma chave for necessária para recuperar, por exemplo, o "Host"
endereço é necessário, então podemos usar
apache_request_headers()['Host']
Para que possamos evitar loops e alinhá-los às saídas de eco
Este trabalho se você tiver um 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