W3docs

$_SERVER

PHP-Superglobale $_SERVER: Schlüssel, Verwendung und sicherer Umgang mit server- und anfragebezogenen Daten in PHP-Skripten.

PHP-Superglobale und die Variable $_SERVER verstehen

PHP ist eine populäre serverseitige Skriptsprache für die Webentwicklung. Eines ihrer Merkmale ist der Satz an Superglobalen — eingebaute Variablen, die in jedem Geltungsbereich verfügbar sind, ohne dass man sie mit dem Schlüsselwort global deklarieren muss. Dieser Artikel behandelt die Superglobale $_SERVER: was sie enthält, welche Schlüssel am häufigsten gebraucht werden und wie man sie sicher liest.

Einen Überblick über alle Superglobalen ($_GET, $_POST, $_SESSION, $_COOKIE und weitere) bietet PHP Superglobals.

Was ist die Variable $_SERVER?

$_SERVER ist ein assoziatives Array, das der Webserver bei jeder Anfrage befüllt. Es enthält Informationen über den Server, das aktuelle Skript und die eingehende HTTP-Anfrage — Header, Pfade, die Anfragemethode, die IP-Adresse des Besuchers sowie ausgewählte Umgebungsvariablen des Systems.

Da es ein Array ist, liest man einzelne Informationen über den Schlüssel aus, zum Beispiel $_SERVER['REQUEST_METHOD'].

Häufig verwendete Schlüssel

SchlüsselWas zurückgegeben wird
$_SERVER['REQUEST_METHOD']Die HTTP-Methode der Anfrage (GET, POST, PUT, …).
$_SERVER['REQUEST_URI']Pfad und Abfragezeichenkette der angeforderten URL, z. B. /products?id=5.
$_SERVER['QUERY_STRING']Nur der Abfragezeichenketten-Anteil der URL, z. B. id=5.
$_SERVER['HTTP_HOST']Host (und Port) aus dem Host-Header der Anfrage.
$_SERVER['SERVER_NAME']Der Hostname, wie er am Server selbst konfiguriert ist.
$_SERVER['HTTPS']Nicht leer, wenn die Anfrage über HTTPS erfolgte.
$_SERVER['REMOTE_ADDR']Die IP-Adresse, von der die Anfrage zu kommen scheint.
$_SERVER['HTTP_USER_AGENT']Der User-Agent-Header des Clients (Browser-/Bot-Identität).
$_SERVER['HTTP_REFERER']Die URL der Seite, die auf das aktuelle Skript verlinkt hat, falls vorhanden.
$_SERVER['SCRIPT_FILENAME']Absoluter Dateisystempfad des ausgeführten Skripts.
$_SERVER['DOCUMENT_ROOT']Das für die Website konfigurierte Dokumentenstammverzeichnis.
$_SERVER['PHP_SELF']Pfad des aktuellen Skripts relativ zum Dokumentenstamm.
$_SERVER['SERVER_PROTOCOL']Protokoll der Anfrage, z. B. HTTP/1.1.

Hinweis: Welche Schlüssel vorhanden sind, hängt vom Webserver ab (Apache, Nginx + PHP-FPM, der eingebaute CLI-Server, …). Auf der Kommandozeile fehlen viele anfragebezogene Schlüssel vollständig. Immer vorsichtig lesen — siehe den Sicherheitsabschnitt weiter unten.

$_SERVER untersuchen

Wenn Sie unsicher sind, was eine bestimmte Umgebung bereitstellt, geben Sie das gesamte Array aus:

<?php
echo '<pre>';
print_r($_SERVER);
echo '</pre>';

Dies gibt jedes Schlüssel/Wert-Paar aus, das der Server für die aktuelle Anfrage bereitgestellt hat — der schnellste Weg, um herauszufinden, worauf man sich verlassen kann.

Verzweigung anhand der Anfragemethode

Eine sehr häufige Verwendung von $_SERVER ist die Entscheidung, was zu tun ist, basierend darauf, wie die Seite angefragt wurde. Eine Formularseite zeigt beispielsweise das Formular bei einer GET-Anfrage an und verarbeitet die übermittelten Daten bei einer POST-Anfrage:

<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    // Handle the submitted form data (validate, save, …)
    echo 'Processing your submission';
} else {
    // First visit — show the empty form
    echo 'Showing the form';
}

Dieses Muster ist das Fundament der Formularverarbeitung in PHP. Lesen Sie PHP Form Handling und PHP Form Validation für den vollständigen Ablauf.

Eine Weiterleitungs-URL aufbauen

Die Funktion header() sendet einen rohen HTTP-Header — einschließlich des Location-Headers für Weiterleitungen. $_SERVER ist praktisch, um das Ziel dynamisch zu erstellen, zum Beispiel um HTTPS für die aktuelle Anfrage zu erzwingen:

<?php
// Redirect to the HTTPS version of the same URL when the request is plain HTTP
if (empty($_SERVER['HTTPS'])) {
    $url = 'https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
    header('Location: ' . $url, true, 301);
    exit;
}

header() muss aufgerufen werden, bevor irgendeine Ausgabe (HTML, echo oder sogar eine Leerzeile) an den Browser gesendet wird. Die exit-Anweisung stoppt das Skript, sodass nach dem Weiterleitungs-Header kein weiterer Inhalt erzeugt wird.

$_SERVER zur Fehlerbehandlung verwenden

Eine weitere Verwendung der Variable $_SERVER ist die Fehlerbehandlung. Sie können beispielsweise den folgenden Code verwenden, um eine benutzerdefinierte Fehlerseite für 404-Fehler anzuzeigen:

PHP 404-Fehlerbehandlung mit $_SERVER

<?php
// Log the error URI using $_SERVER
error_log('404 Error: ' . $_SERVER['REQUEST_URI']);
http_response_code(404);
include '404.html';
?>

In diesem Beispiel wird $_SERVER['REQUEST_URI'] verwendet, um den angeforderten Pfad zu Protokollierungszwecken zu erfassen. Anstatt weiterzuleiten, setzt das Skript den korrekten HTTP-Statuscode und bindet eine benutzerdefinierte Vorlage ein — das ist die Standardpraxis für die Fehlerbehandlung.

Sicherheit: client-kontrollierte Werte nicht vertrauen

Einige $_SERVER-Schlüssel stammen aus der Anfrage und werden vollständig vom Client gesteuert, können also gefälscht werden. Behandeln Sie sie als nicht vertrauenswürdige Eingaben:

  • HTTP_HOST, HTTP_REFERER, HTTP_USER_AGENT und alle anderen HTTP_*-Schlüssel sind nur Anfrage-Header — ein bösartiger Client kann beliebige Werte senden. Geben Sie sie niemals ohne Escaping in HTML aus (verwenden Sie htmlspecialchars()), und validieren Sie HTTP_HOST gegen eine Erlaubnisliste, bevor Sie ihn in einer Weiterleitung verwenden.
  • PHP_SELF kann injizierte Pfaddaten enthalten und ist eine klassische Quelle für Cross-Site-Scripting (XSS), wenn es im action-Attribut eines Formulars ausgegeben wird. Escapen Sie es.
  • REMOTE_ADDR ist die verbindende Adresse; hinter einem Proxy oder Load Balancer befindet sich die echte Client-IP möglicherweise in einem anderen Header. Verlassen Sie sich bei Sicherheitsentscheidungen nicht allein auf REMOTE_ADDR.

Ein sicherer Weg, einen fehlenden Schlüssel ohne Warnung zu prüfen, ist der Null-Koaleszenz-Operator:

<?php
$method = $_SERVER['REQUEST_METHOD'] ?? 'GET';
echo $method;

Dies vermeidet eine Warnung wegen eines „undefinierten Array-Schlüssels", wenn der Schlüssel nicht gesetzt ist (zum Beispiel beim Ausführen über die CLI).

Fazit

Die Superglobale $_SERVER gibt PHP-Skripten Zugriff auf Anfrage- und Umgebungsdetails — die HTTP-Methode, die angeforderte URL, Host, Pfade und die IP-Adresse des Besuchers. Sie ermöglicht alltägliche Aufgaben wie methodenbasierte Formularverarbeitung, Weiterleitungen und Fehlerprotokollierung. Denken Sie daran, dass von Headern abgeleitete Schlüssel client-kontrolliert sind: Validieren und escapen Sie sie vor der Verwendung.

Um tiefer einzusteigen, erkunden Sie die verwandten Superglobalen: $_GET, $_POST und $_REQUEST.

Hinweis: In modernem PHP ist das schließende ?> Tag optional und wird oft weggelassen, um versehentliche Leerzeichen-Ausgabe zu vermeiden.

Übungen

Übung
Welche Informationen kann die PHP $_SERVER Superglobale Variable liefern?
Welche Informationen kann die PHP $_SERVER Superglobale Variable liefern?
Was this page helpful?