Signatur
Beschreibung
get_headers() sendet einen HTTP-Request (standardmäßig HEAD) an die angegebene URL und liefert alle Antwort-Header des Servers als Array zurück. Dies ist nützlich, um beispielsweise den HTTP-Statuscode, den Content-Type, Weiterleitungen oder Cache-Informationen einer Ressource zu ermitteln, ohne den eigentlichen Inhalt herunterladen zu müssen.
Wird der Parameter $associative auf true gesetzt, werden die Header als assoziatives Array zurückgegeben (Schlüssel = Header-Name, Wert = Header-Wert). Gibt es mehrere Header mit demselben Namen (z. B. mehrere Set-Cookie-Einträge), enthält der Wert ein Array statt eines Strings. Ohne diesen Parameter erhält man ein indiziertes Array mit rohen Header-Zeilen.
Mit dem optionalen $context-Parameter lässt sich ein Stream-Kontext übergeben, der z. B. für HTTP-Authentifizierung, benutzerdefinierte Header oder Proxy-Einstellungen genutzt werden kann. Die Funktion nutzt intern den PHP-Stream-Wrapper und ist daher von der allow_url_fopen-Einstellung in der php.ini abhängig.
Im Fehlerfall – etwa bei einer nicht erreichbaren URL oder einem DNS-Fehler – gibt die Funktion false zurück und erzeugt eine Warnung. Der Standard-Request-Typ ist HEAD; soll stattdessen GET verwendet werden, muss ein entsprechender Stream-Kontext übergeben werden.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $url Pflicht | string | Die vollständige URL, deren Header abgerufen werden sollen (z. B. 'https://example.com/'). |
|
| $associative | bool | false | Wenn true, werden die Header als assoziatives Array zurückgegeben (Header-Name als Schlüssel). Standardmäßig (false) wird ein indiziertes Array mit rohen Header-Zeilen geliefert. |
| $context | resource|null | null | Ein optionaler Stream-Kontext, der mit stream_context_create() erstellt wurde. Ermöglicht z. B. benutzerdefinierte HTTP-Methoden, Proxy-Server oder Zeitlimits. |
Rückgabewert
$associative false, enthält das Array indizierte Strings (z. B. 'HTTP/1.1 200 OK'). Bei $associative = true ein assoziatives Array (Header-Name → Wert). Gibt false zurück, wenn die URL nicht erreichbar ist oder ein Fehler auftritt.Beispiele
Einfache Header-Abfrage (indiziertes Array)
<?php
$headers = get_headers('https://www.example.com/');
if ($headers === false) {
echo 'Fehler: Konnte keine Verbindung herstellen.';
} else {
foreach ($headers as $header) {
echo $header . PHP_EOL;
}
}
Assoziatives Array und HTTP-Statuscode prüfen
<?php
$headers = get_headers('https://www.example.com/', true);
if ($headers === false) {
echo 'URL nicht erreichbar.' . PHP_EOL;
} else {
// Statuszeile steht unter Index 0
echo 'Status: ' . $headers[0] . PHP_EOL;
if (isset($headers['Content-Type'])) {
echo 'Content-Type: ' . $headers['Content-Type'] . PHP_EOL;
}
if (isset($headers['Location'])) {
echo 'Weiterleitung zu: ' . $headers['Location'] . PHP_EOL;
}
}
GET-Request erzwingen via Stream-Kontext
<?php
$context = stream_context_create([
'http' => [
'method' => 'GET',
'timeout' => 5,
],
]);
$headers = get_headers('https://www.example.com/', true, $context);
if ($headers !== false) {
echo 'Übertragungscodierung: ' . ($headers['Transfer-Encoding'] ?? 'nicht angegeben') . PHP_EOL;
}
// Wichtig · Fallstricke
Voraussetzung: get_headers() benötigt einen aktivierten URL-Wrapper. Die Direktive allow_url_fopen muss in der php.ini auf On gesetzt sein, andernfalls schlägt die Funktion fehl.
Weiterleitungen: PHP folgt standardmäßig HTTP-Weiterleitungen, sofern der Stream-Kontext dies nicht deaktiviert ('follow_location' => 0). Bei mehrfachen Weiterleitungen können mehrere Statuszeilen im zurückgegebenen Array erscheinen – der letzte HTTP-Status ist dann der maßgebliche.
Sicherheit: Wenn die URL aus Benutzereingaben stammt, muss sie unbedingt validiert und gefiltert werden (z. B. mit filter_var($url, FILTER_VALIDATE_URL)), um SSRF-Angriffe (Server-Side Request Forgery) zu verhindern. Internes Netzwerk und Loopback-Adressen sollten explizit ausgeschlossen werden.
Performance: Für häufige oder parallelisierte Header-Abfragen ist cURL (curl_init()) mit CURLOPT_NOBODY eine leistungsfähigere Alternative, da es keine Abhängigkeit von allow_url_fopen besitzt und feingranulare Konfiguration erlaubt.