HTTP_HOST vs SERVER_NAME in PHP: Wo liegt der Haken?

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

PHP-Detektiv: Was verbirgt sich hinter HTTP_HOST und SERVER_NAME?

\n\n

Wenn Sie jemals einen Blick in das superglobale Array $_SERVER in PHP geworfen haben, sind Ihnen sicherlich zwei sehr ähnliche Schlüssel aufgefallen: HTTP_HOST und SERVER_NAME. Auf den ersten Blick scheint es dasselbe zu sein – der Servername. Aber erfahrene Entwickler wissen: Der Teufel steckt im Detail. Dieses Thema hat auf Stack Overflow tausende Aufrufe gesammelt, und das nicht ohne Grund. Die falsche Wahl kann zu Bugs bei Weiterleitungen, Fehlern bei Cross-Domain-Anfragen und sogar zu Sicherheitslücken führen.

\n

In diesem Artikel werden wir nicht nur trockene Definitionen auflisten. Wir führen eine echte Untersuchung durch: Wir analysieren, woher diese Werte kommen, wie sie sich auf verschiedenen Servern (Apache, Nginx) verhalten, und vor allem – wann welche Variante verwendet werden sollte. Schnallen Sie sich an, es wird interessant.

\n\n

Was ist HTTP_HOST?

\n

HTTP_HOST ist der Wert des Host-Headers, den der Browser (oder ein anderer HTTP-Client) als Teil der Anfrage an den Server sendet. Dieser Header ist in HTTP/1.1 obligatorisch und enthält den Domainnamen und möglicherweise die Portnummer.

\n

Beispiel einer Browseranfrage:

\n
GET /page.php HTTP/1.1\nHost: pythonlib.ru:8080\nUser-Agent: Mozilla/5.0\n...
\n

In PHP gelangt dieser Wert in $_SERVER['HTTP_HOST']. Beachten Sie: Dies ist ein nicht überprüfter Wert. Der Client kann beliebigen Text im Host-Header senden, z. B. evil-site.com oder 192.168.1.1. Hier liegt die Hauptgefahr.

\n\n

Was ist SERVER_NAME?

\n

SERVER_NAME ist ein Wert, den der Webserver selbst basierend auf seiner Konfiguration festlegt. Normalerweise stammt er aus der Direktive ServerName in Apache oder server_name in Nginx. Dies ist der Name des virtuellen Hosts, der die Anfrage bearbeitet hat.

\n

Beispiel einer Apache-Konfiguration:

\n
<VirtualHost *:80>\n    ServerName pythonlib.ru\n    DocumentRoot /var/www/pythonlib\n</VirtualHost>
\n

In diesem Fall ist $_SERVER['SERVER_NAME'] gleich pythonlib.ru. Im Gegensatz zu HTTP_HOST wird dieser Wert vom Serveradministrator kontrolliert, nicht vom Client. Es gibt jedoch eine Nuance: SERVER_NAME enthält möglicherweise keinen Port (abhängig von der Einstellung UseCanonicalName).

\n\n

Wesentliche Unterschiede in der Tabelle

\n

Zur Veranschaulichung fassen wir alles in einer Tabelle zusammen:

\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
ParameterHTTP_HOSTSERVER_NAME
QuelleHTTP-Request-Header vom ClientWebserver-Konfiguration
KontrolleClient (kann gefälscht werden)Serveradministrator
PortEnthält Port, wenn nicht standardmäßig (z. B. site.com:8080)Normalerweise ohne Port (abhängig von UseCanonicalName)
ZuverlässigkeitNiedrig (nicht ohne Prüfung vertrauen)Hoch (aber nicht absolut)
VerwendungWeiterleitungen, Links für den BenutzerInterne Logik, Sicherheit
\n\n

Wann was verwenden? Praktische Beispiele

\n

Kommen wir nun zum Wichtigsten – dem Code. Betrachten wir drei typische Szenarien.

\n\n

1. Weiterleitung auf dieselbe Domain (z. B. von www

Blogs

Buchempfehlungen