Signatur
Beschreibung
getallheaders() liest sämtliche HTTP-Header aus, die der Client (z. B. Browser oder API-Konsument) mit der aktuellen Anfrage an den Server geschickt hat. Das Ergebnis ist ein assoziatives Array, bei dem die Schlüssel die Header-Namen und die Werte die zugehörigen Header-Werte sind.
Die Funktion ist besonders nützlich, wenn eine Anwendung auf spezifische Header reagieren muss – etwa zur Authentifizierung über Authorization-Header, zur Auswertung von Accept-Typen oder zur Analyse benutzerdefinierter Header (z. B. X-Api-Key). Sie ist eine praktische Alternative zum manuellen Durchsuchen des $_SERVER-Arrays nach Schlüsseln mit dem Präfix HTTP_.
Ursprünglich war getallheaders() nur unter Apache verfügbar. Ab PHP 5.4 steht sie auch beim eingebauten Entwicklungsserver und in FastCGI-Umgebungen zur Verfügung. Unter anderen Webservern (z. B. Nginx ohne angepasste Konfiguration) kann die Funktion nicht verfügbar oder unvollständig sein – in diesem Fall empfiehlt sich ein manueller Fallback über $_SERVER.
Die Header-Namen werden in ihrer originalen Schreibweise (Groß-/Kleinbuchstaben je nach Client) zurückgegeben, was bei Vergleichen beachtet werden sollte. Ein case-insensitiver Vergleich ist daher ratsam.
Rückgabewert
false zurückgegeben (z. B. wenn die Funktion außerhalb eines HTTP-Request-Kontexts aufgerufen wird).Beispiele
Alle Request-Header ausgeben
<?php
$headers = getallheaders();
if ($headers === false) {
echo 'Konnte Header nicht auslesen.';
} else {
foreach ($headers as $name => $value) {
echo htmlspecialchars($name) . ': ' . htmlspecialchars($value) . "\n";
}
}
API-Key aus einem benutzerdefinierten Header auslesen
<?php
// Client sendet: X-Api-Key: mein-geheimer-schluessel
$headers = getallheaders();
// Case-insensitiver Zugriff auf den Header
$normalizedHeaders = array_change_key_case($headers, CASE_LOWER);
$apiKey = $normalizedHeaders['x-api-key'] ?? null;
if ($apiKey === null) {
http_response_code(401);
echo json_encode(['error' => 'API-Key fehlt']);
exit;
}
if ($apiKey !== 'mein-geheimer-schluessel') {
http_response_code(403);
echo json_encode(['error' => 'Ungültiger API-Key']);
exit;
}
echo json_encode(['status' => 'Zugriff erlaubt']);
Fallback für Umgebungen ohne getallheaders()
<?php
/**
* Liest alle HTTP-Request-Header auch in Umgebungen ohne getallheaders().
*/
function getAllRequestHeaders(): array {
if (function_exists('getallheaders')) {
return getallheaders() ?: [];
}
$headers = [];
foreach ($_SERVER as $key => $value) {
if (str_starts_with($key, 'HTTP_')) {
$name = str_replace('_', '-', substr($key, 5));
$name = ucwords(strtolower($name), '-');
$headers[$name] = $value;
} elseif (in_array($key, ['CONTENT_TYPE', 'CONTENT_LENGTH'], true)) {
$name = str_replace('_', '-', $key);
$name = ucwords(strtolower($name), '-');
$headers[$name] = $value;
}
}
return $headers;
}
$headers = getAllRequestHeaders();
print_r($headers);
// Wichtig · Fallstricke
Serverkompatiblität: getallheaders() ist nicht auf allen Webserver-Umgebungen zuverlässig verfügbar. Unter Apache und dem eingebauten PHP-Entwicklungsserver (seit PHP 5.4) funktioniert sie problemlos. Bei Nginx oder anderen FastCGI-Konfigurationen sollte die Verfügbarkeit mit function_exists('getallheaders') geprüft und ein Fallback implementiert werden.
Sicherheit: HTTP-Header können vom Client frei gesetzt werden und sind damit nicht vertrauenswürdig. Werte aus getallheaders() sollten niemals ungeprüft in Datenbankabfragen, Dateinamen oder HTML-Ausgaben einfließen. Es sind immer geeignete Validierungs- und Escape-Maßnahmen anzuwenden.
Groß-/Kleinschreibung: HTTP/1.1-Header-Namen sind laut Standard case-insensitiv, aber getallheaders() gibt sie in der vom Client gesendeten Schreibweise zurück. Für sichere Vergleiche empfiehlt sich array_change_key_case() in Kombination mit CASE_LOWER.