Antworten:
IF : Sie benötigen nur einen einzigen Header. Anstelle aller Header ist die schnellste Methode:
<?php
// Replace XXXXXX_XXXX with the name of the header you need in UPPERCASE (and with '-' replaced by '_')
$headerStringValue = $_SERVER['HTTP_XXXXXX_XXXX'];
SONST WENN : Sie führen PHP als Apache-Modul oder ab PHP 5.4 mit FastCGI (einfache Methode) aus:
<?php
$headers = apache_request_headers();
foreach ($headers as $header => $value) {
echo "$header: $value <br />\n";
}
ELSE: In jedem anderen Fall können Sie Folgendes verwenden (Userland-Implementierung):
<?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";
}
Siehe auch :
getallheaders () - (PHP> = 5.4) plattformübergreifende Edition Alias von apache_request_headers()
apache_response_headers () - Ruft alle HTTP- Antwortheader ab .
headers_list () - Ruft eine Liste der zu sendenden Header ab.
$_SERVER['HTTP_X_REQUESTED_WITH']
RFC3875 , 4.1.18:
Metavariablen mit Namen, die mit beginnen,
HTTP_
enthalten Werte, die aus den Headerfeldern für Clientanforderungen gelesen wurden, wenn das verwendete Protokoll HTTP ist. Der Name des HTTP-Headerfelds wird in Großbuchstaben konvertiert, alle Vorkommen werden durch-
ersetzt_
und derHTTP_
Metavariablenname wird vorangestellt.
$_SERVER
Variable einfügt? Die PHP-Dokumentation unter php.net/manual/en/reserved.variables.server.php weicht aus, was wir sicher sein können, dass es dort sein wird.
cache-control
Header, aber ich sehe ihn nirgendwo in $_SERVER
. Ich sehe mehrere Header mit dem Präfix HTTP_
"HTTP_ACCEPT", "HTTP_UPGRADE_INSECURE_REQUESTS" und "HTTP_USER_AGENT" (unter anderem). Aber nichts für "Cache-Kontrolle", auch nichts für "Pragma". Dies ist unabhängig von Groß- und Kleinschreibung oder HTTP_
Präfix. Vermisse ich etwas
_SERVER["HTTP_CACHE_CONTROL"] max-age=0
Sie sollten alle HTTP-Header in der $_SERVER
globalen Variablen finden, der HTTP_
Großbuchstaben vorangestellt sind und durch Bindestriche (-) ersetzt werden, die durch Unterstriche (_) ersetzt werden.
Zum Beispiel finden Sie Ihre X-Requested-With
in:
$_SERVER['HTTP_X_REQUESTED_WITH']
Es kann zweckmäßig sein, aus der $_SERVER
Variablen ein assoziatives Array zu erstellen . Dies kann in verschiedenen Stilen erfolgen, aber hier ist eine Funktion, die Kamelschlüssel ausgibt:
$headers = array();
foreach ($_SERVER as $key => $value) {
if (strpos($key, 'HTTP_') === 0) {
$headers[str_replace(' ', '', ucwords(str_replace('_', ' ', strtolower(substr($key, 5)))))] = $value;
}
}
Verwenden Sie jetzt einfach $headers['XRequestedWith']
, um den gewünschten Header abzurufen.
PHP-Handbuch unter $_SERVER
: http://php.net/manual/en/reserved.variables.server.php
parseRequestHeaders()
Funktion zu ermitteln. Wenn ein solches assoziatives Array benötigt wird, ist IMO die Apache-Funktion die beste Option, da sie genau die empfangenen Header anstelle einer verstümmelten CamelCase-Version zurückgibt. (Beachten Sie auch, dass es ab PHP 5.4 nicht mehr nur Apache ist.)
apache_request_headers()
oder getallheaders()
scheint die Header-Namen beim Testen nicht groß zu schreiben. Sie kehren genau so zurück, wie ich von der Client-Seite komme. Warum setzen Sie dann Headernamen in einer solchen Ersetzungsfunktion groß?
Seit PHP 5.4.0 können Sie eine getallheaders
Funktion verwenden, die alle Anforderungsheader als assoziatives Array zurückgibt:
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) [...]"
// }
Früher funktionierte diese Funktion nur, wenn PHP als Apache / NSAPI-Modul ausgeführt wurde.
strtolower
Da in mehreren der vorgeschlagenen Lösungen RFC2616 (HTTP / 1.1) fehlt, werden Headerfelder als Entitäten definiert, bei denen die Groß- und Kleinschreibung nicht berücksichtigt wird. Das Ganze, nicht nur der Wert .
Vorschläge wie das Parsen von HTTP_- Einträgen sind also falsch.
Besser wäre so:
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();
}
Beachten Sie die subtilen Unterschiede zu früheren Vorschlägen. Die Funktion funktioniert hier auch mit php-fpm (+ nginx).
Date
Header - und dass "Parameterwerte [Text in Inhaltstyp nach Semikolon] möglicherweise zwischen Groß- und Kleinschreibung unterscheiden oder nicht". Angesichts der Tatsache, dass es mindestens zwei Header mit Werten gibt, bei denen zwischen Groß- und Kleinschreibung unterschieden wird, scheinen Sie sich zu irren.
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.
Also ich denke du liegst falsch.
Übergeben Sie dieser Funktion einen Headernamen, um den Wert ohne Verwendung der for
Schleife abzurufen. Gibt null zurück, wenn der Header nicht gefunden wurde.
/**
* @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;
}
Hinweis: Dies funktioniert nur mit Apache-Servern, siehe: http://php.net/manual/en/function.getallheaders.php
Hinweis: Diese Funktion verarbeitet und lädt alle Header in den Speicher und ist weniger performant als eine for
Schleife.
Um die Sache zu vereinfachen, können Sie wie folgt genau das bekommen, was Sie wollen:
Einfach:
$headerValue = $_SERVER['HTTP_X_REQUESTED_WITH'];
oder wenn Sie einen nach dem anderen benötigen:
<?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' );
Die anderen Header befinden sich ebenfalls im superglobalen Array $ _SERVER. Informationen dazu finden Sie hier: http://php.net/manual/en/reserved.variables.server.php
HTTP_
$headerKey
Ich habe CodeIgniter verwendet und den folgenden Code verwendet, um ihn abzurufen. Kann in Zukunft für jemanden nützlich sein.
$this->input->get_request_header('X-Requested-With');
Hier ist, wie ich es mache. Sie müssen alle Header abrufen, wenn $ header_name nicht übergeben wird:
<?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");
?>
Es sieht für mich viel einfacher aus als die meisten Beispiele in anderen Antworten. Dadurch werden auch die Methode (GET / POST / etc.) Und die angeforderte URI abgerufen, wenn alle Header abgerufen werden. Dies kann hilfreich sein, wenn Sie versuchen, sie für die Protokollierung zu verwenden.
Hier ist die Ausgabe:
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
Hier ist eine einfache Möglichkeit, dies zu tun.
// 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;
}
}
Dieses kleine PHP-Snippet kann für Sie hilfreich sein:
<?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;
}
Ich benutze diese Funktion, um die benutzerdefinierten Header zu erhalten. Wenn der Header von "HTTP_X_" ausgeht, drücken wir das Array ein :)
Wenn zum Abrufen nur ein Schlüssel erforderlich ist, z. B. eine "Host"
Adresse, können wir verwenden
apache_request_headers()['Host']
Damit wir Schleifen vermeiden und in die Echoausgänge einbinden können
Dies funktioniert, wenn Sie einen Apache-Server haben
PHP-Code:
$headers = apache_request_headers();
foreach ($headers as $header => $value) {
echo "$header: $value <br />\n";
}
Ergebnis:
Accept: */*
Accept-Language: en-us
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0
Host: www.example.com
Connection: Keep-Alive