Odpowiedzi:
JEŻELI : potrzebujesz tylko jednego nagłówka, zamiast wszystkich nagłówków, najszybszą metodą jest:
<?php
// Replace XXXXXX_XXXX with the name of the header you need in UPPERCASE (and with '-' replaced by '_')
$headerStringValue = $_SERVER['HTTP_XXXXXX_XXXX'];
ELSE JEŻELI : uruchamiasz PHP jako moduł Apache lub, począwszy od PHP 5.4, używając FastCGI (prosta metoda):
<?php
$headers = apache_request_headers();
foreach ($headers as $header => $value) {
echo "$header: $value <br />\n";
}
ELSE: W każdym innym przypadku możesz użyć (implementacja przestrzeni użytkownika):
<?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";
}
Zobacz też :
getallheaders () - (PHP> = 5.4) edycja wieloplatformowa Alias apache_request_headers()
apache_response_headers () - Pobierz wszystkie nagłówki odpowiedzi HTTP.
headers_list () - Pobierz listę nagłówków do wysłania.
$_SERVER['HTTP_X_REQUESTED_WITH']
Meta-zmienne o nazwach rozpoczynających się od
HTTP_
zawierają wartości odczytane z pól nagłówka żądania klienta, jeśli używany jest protokół HTTP. Nazwa pola nagłówka HTTP jest konwertowana na wielkie litery, wszystkie wystąpienia zostały-
zastąpione_
iHTTP_
poprzedza nazwę meta-zmiennej.
$_SERVER
zmiennej? Dokumentacja PHP pod adresem php.net/manual/en/reserved.variables.server.php nie jest pewna, co możemy być pewni.
cache-control
nagłówek, ale nigdzie go nie widzę $_SERVER
. Widzę kilka nagłówków z prefiksem HTTP_
, w tym „HTTP_ACCEPT”, „HTTP_UPGRADE_INSECURE_REQUESTS” i „HTTP_USER_AGENT” (między innymi). Ale nic dla „kontroli pamięci podręcznej” również nic dla „pragmy”. Jest to niezależne od wielkości liter lub HTTP_
prefiksu. Czy coś brakuje?
_SERVER["HTTP_CACHE_CONTROL"] max-age=0
Powinieneś znaleźć wszystkie nagłówki HTTP w $_SERVER
zmiennej globalnej z HTTP_
wielkimi literami i myślnikami (-) zastąpionymi znakami podkreślenia (_).
Na przykład X-Requested-With
można znaleźć w:
$_SERVER['HTTP_X_REQUESTED_WITH']
Wygodne może być utworzenie tablicy asocjacyjnej ze $_SERVER
zmiennej. Można to zrobić w kilku stylach, ale oto funkcja, która wyprowadza klawisze z wielbłądziem:
$headers = array();
foreach ($_SERVER as $key => $value) {
if (strpos($key, 'HTTP_') === 0) {
$headers[str_replace(' ', '', ucwords(str_replace('_', ' ', strtolower(substr($key, 5)))))] = $value;
}
}
Teraz wystarczy użyć, $headers['XRequestedWith']
aby pobrać żądany nagłówek.
Podręcznik PHP na $_SERVER
: http://php.net/manual/en/reserved.variables.server.php
parseRequestHeaders()
funkcji. Jeśli taka tablica asocjacyjna jest potrzebna, wtedy najlepszą opcją jest funkcja IMO, ponieważ zwraca ona dokładnie odebrane nagłówki zamiast zniekształconej wersji CamelCase. (Zauważ też, że od PHP 5.4 nie jest już tylko Apache.)
apache_request_headers()
lub getallheaders()
wydaje się, że nie testuję wielkich liter w nagłówkach. Wracają dokładnie tak, jak przechodzę od strony klienta. Dlaczego więc używasz wielkich liter w takiej funkcji zastępczej?
Od PHP 5.4.0 możesz używać getallheaders
funkcji, która zwraca wszystkie nagłówki żądań jako tablicę asocjacyjną:
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) [...]"
// }
Wcześniej ta funkcja działała tylko wtedy, gdy PHP działało jako moduł Apache / NSAPI.
strtolower
brakuje kilku proponowanych rozwiązań, RFC2616 (HTTP / 1.1) definiuje pola nagłówka jako byty bez rozróżniania wielkości liter. Cała sprawa, nie tylko część wartości .
Dlatego sugestie, takie jak tylko analizowanie wpisów HTTP_, są błędne.
Lepiej byłoby tak:
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();
}
Zwróć uwagę na subtelne różnice w stosunku do poprzednich sugestii. Ta funkcja działa również na php-fpm (+ nginx).
Date
nagłówka - i że „Wartości parametrów [tekst w typie treści po średniku] może, ale nie musi, rozróżniać małe i wielkie litery”. Biorąc pod uwagę, że istnieją co najmniej dwa nagłówki z wartościami uwzględniającymi wielkość liter, wydaje się, że się mylisz.
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.
Więc chyba się mylisz.
Przekaż nazwę nagłówka do tej funkcji, aby uzyskać jej wartość bez użycia for
pętli. Zwraca null, jeśli nagłówek nie został znaleziony.
/**
* @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;
}
Uwaga: działa tylko z serwerem Apache, patrz: http://php.net/manual/en/function.getallheaders.php
Uwaga: ta funkcja przetwarza i ładuje wszystkie nagłówki do pamięci i jest mniej wydajna niż for
pętla.
Aby uprościć sprawę, oto jak możesz uzyskać tylko to, czego potrzebujesz:
Prosty:
$headerValue = $_SERVER['HTTP_X_REQUESTED_WITH'];
lub gdy musisz zdobyć jeden na raz:
<?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' );
Pozostałe nagłówki są również w superglobalnej tablicy $ _SERVER, możesz przeczytać o tym, jak je uzyskać tutaj: http://php.net/manual/en/reserved.variables.server.php
HTTP_
do$headerKey
Korzystałem z CodeIgniter i użyłem kodu poniżej, aby go zdobyć. Może być przydatny dla kogoś w przyszłości.
$this->input->get_request_header('X-Requested-With');
Oto jak to robię. Musisz pobrać wszystkie nagłówki, jeśli $ nazwa_ nagłówka nie zostanie przekazana:
<?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");
?>
Wygląda mi to na znacznie prostsze niż większość przykładów podanych w innych odpowiedziach. Pobiera to również metodę (GET / POST / etc.) I identyfikator URI wymagany podczas pobierania wszystkich nagłówków, co może być przydatne, jeśli próbujesz użyć go do logowania.
Oto wynik:
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
Oto prosty sposób, aby to zrobić.
// 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;
}
}
Ten mały fragment kodu PHP może być dla Ciebie pomocny:
<?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;
}
Korzystam z tej funkcji, aby uzyskać niestandardowe nagłówki, jeśli nagłówek zaczyna się od „HTTP_X_”, pchamy tablicę :)
jeśli do pobrania wymagany jest tylko jeden klucz, na przykład "Host"
wymagany jest adres, wówczas możemy go użyć
apache_request_headers()['Host']
Abyśmy mogli uniknąć pętli i umieścić je w linii do wyjść echa
Działa to, jeśli masz serwer Apache
Kod PHP:
$headers = apache_request_headers();
foreach ($headers as $header => $value) {
echo "$header: $value <br />\n";
}
Wynik:
Accept: */*
Accept-Language: en-us
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0
Host: www.example.com
Connection: Keep-Alive