Signatur
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
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;
}
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.';
}
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();
// 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.