Start · Sprachen · PHP · Referenz · get_headers

get_headers

Funktion

Sendet einen HTTP-HEAD-Request an eine URL und gibt alle vom Server zurückgesendeten Antwort-Header zurück.

seit PHP 5.0.0 Kategorie: http

Signatur

get_headers(string $url, bool $associative = false, ?resource $context = null): array|false

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

Typ
array|false
Beschreibung
Bei Erfolg ein Array der Antwort-Header. Ist $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;
    }
}
HTTP/1.1 200 OK Content-Type: text/html; charset=UTF-8 Date: Mon, 01 Jan 2024 12:00:00 GMT ...

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;
    }
}
Status: HTTP/1.1 200 OK Content-Type: text/html; charset=UTF-8

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;
}
Übertragungscodierung: chunked

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