Start · Sprachen · PHP · Referenz · getallheaders

getallheaders

Funktion

Gibt alle HTTP-Request-Header der aktuellen Anfrage als assoziatives Array zurück.

seit PHP 4.0.0 Kategorie: misc

Signatur

getallheaders(): array|false

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

Typ
array|false
Beschreibung
Gibt ein assoziatives Array zurück, in dem jeder Schlüssel ein Header-Name und jeder Wert der entsprechende Header-Wert als String ist. Im Fehlerfall wird 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";
    }
}
Host: example.com User-Agent: Mozilla/5.0 ... Accept: text/html,application/xhtml+xml,... Accept-Language: de-DE,de;q=0.9 Accept-Encoding: gzip, deflate, br Connection: keep-alive

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']);
{"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);
Array ( [Host] => example.com [Accept] => */* [Content-Type] => application/json )

// 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.