$_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üssel | Was 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_AGENTund alle anderenHTTP_*-Schlüssel sind nur Anfrage-Header — ein bösartiger Client kann beliebige Werte senden. Geben Sie sie niemals ohne Escaping in HTML aus (verwenden Siehtmlspecialchars()), und validieren SieHTTP_HOSTgegen eine Erlaubnisliste, bevor Sie ihn in einer Weiterleitung verwenden.PHP_SELFkann injizierte Pfaddaten enthalten und ist eine klassische Quelle für Cross-Site-Scripting (XSS), wenn es imaction-Attribut eines Formulars ausgegeben wird. Escapen Sie es.REMOTE_ADDRist 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 aufREMOTE_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.