Start · Sprachen · PHP · Referenz · headers_list

headers_list

Funktion

Gibt eine Liste aller bisher gesetzten oder bereits gesendeten HTTP-Antwort-Header als indiziertes Array zurück.

seit PHP 5.0.0 Kategorie: http

Signatur

headers_list(): array

Beschreibung

headers_list() liefert alle HTTP-Antwort-Header, die entweder bereits an den Client gesendet wurden oder noch im Puffer auf das Senden warten. Jeder Eintrag im zurückgegebenen Array ist ein vollständiger Header-String im Format Name: Wert, so wie er tatsächlich übertragen wird.

Die Funktion eignet sich besonders zur Fehlersuche und zum Prüfen, ob bestimmte Header (z. B. Content-Type, Cache-Control oder Set-Cookie) korrekt gesetzt wurden – etwa in Middleware-Schichten, Frameworks oder Test-Umgebungen. Im Gegensatz zu headers_sent(), das nur angibt ob Header bereits gesendet wurden, zeigt headers_list() welche Header gesetzt sind.

Wichtig: Die Funktion gibt nur die von PHP selbst verwalteten Header zurück. Header, die direkt über den Webserver (z. B. Apache, Nginx) gesetzt wurden, erscheinen nicht in der Liste. Ebenso werden Standard-Header wie HTTP/1.1 200 OK (der Statuscode-Header) nicht zwingend aufgeführt – für den HTTP-Statuscode sollte man stattdessen http_response_code() verwenden.

In der CLI (Kommandozeile) werden Header grundsätzlich nicht gesendet, weshalb die Funktion dort ein leeres Array zurückgibt.

Rückgabewert

Typ
array
Beschreibung
Gibt ein indiziertes Array von Strings zurück. Jeder String ist ein vollständiger HTTP-Header in der Form Name: Wert. Wurden noch keine Header gesetzt, ist das Array leer.

Beispiele

Gesetzte Header auflisten und prüfen

<?php
header('Content-Type: application/json; charset=UTF-8');
header('Cache-Control: no-cache, no-store, must-revalidate');
header('X-Custom-Header: MeinWert');

$headers = headers_list();

foreach ($headers as $header) {
    echo $header . PHP_EOL;
}
Content-Type: application/json; charset=UTF-8 Cache-Control: no-cache, no-store, must-revalidate X-Custom-Header: MeinWert

Prüfen ob Content-Type bereits gesetzt ist

<?php
header('Content-Type: text/html; charset=UTF-8');

$headers = headers_list();

$contentTypeGesetzt = false;
foreach ($headers as $header) {
    if (stripos($header, 'Content-Type:') === 0) {
        $contentTypeGesetzt = true;
        break;
    }
}

if ($contentTypeGesetzt) {
    echo 'Content-Type-Header ist gesetzt.';
} else {
    // Fallback setzen
    header('Content-Type: text/plain; charset=UTF-8');
    echo 'Content-Type-Header wurde als Fallback gesetzt.';
}
Content-Type-Header ist gesetzt.

Einsatz in einem Unit-Test (Ausgabepuffer)

<?php
// Ausgabepufferung aktivieren, damit header() ohne Fehler aufgerufen werden kann
ob_start();

header('Location: https://example.com');
header('X-Frame-Options: DENY');

$headers = headers_list();

// Prüfen, ob der Redirect-Header vorhanden ist
$hatRedirect = in_array('Location: https://example.com', $headers);
echo $hatRedirect ? 'Redirect-Header gefunden.' : 'Redirect-Header fehlt.';

ob_end_clean();
Redirect-Header gefunden.

// Wichtig · Fallstricke

Testumgebungen: Beim Einsatz in Unit-Tests (z. B. mit PHPUnit) können Header oft nicht regulär gesetzt werden, da PHPUnit selbst Ausgaben erzeugt. In diesem Fall bietet sich ob_start() oder eine Mock-Lösung an. Bibliotheken wie php-mock oder Frameworks wie Symfony und Laravel kapseln das Header-Handling in eigenen Abstraktionen, die sich im Test einfacher prüfen lassen.

Bereits gesendete Header: Sobald Ausgaben (auch ein einzelnes Leerzeichen oder die BOM-Markierung) erzeugt wurden, hat PHP die Header bereits verschickt. headers_list() kann dann zwar noch Ergebnisse liefern, neue Header lassen sich aber nicht mehr setzen. Zur Prüfung sollte man headers_sent() kombinieren.

CLI: Auf der Kommandozeile gibt headers_list() stets ein leeres Array zurück, da kein HTTP-Kontext vorhanden ist.