PHP-Detektiv: Was verbirgt sich hinter HTTP_HOST und SERVER_NAME?
\n\nWenn 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.
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\nWas ist HTTP_HOST?
\nHTTP_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.
Beispiel einer Browseranfrage:
\nGET /page.php HTTP/1.1\nHost: pythonlib.ru:8080\nUser-Agent: Mozilla/5.0\n...\nIn 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.
Was ist SERVER_NAME?
\nSERVER_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.
Beispiel einer Apache-Konfiguration:
\n<VirtualHost *:80>\n ServerName pythonlib.ru\n DocumentRoot /var/www/pythonlib\n</VirtualHost>\nIn 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).
Wesentliche Unterschiede in der Tabelle
\nZur Veranschaulichung fassen wir alles in einer Tabelle zusammen:
\n| Parameter | \nHTTP_HOST | \nSERVER_NAME | \n
|---|---|---|
| Quelle | \nHTTP-Request-Header vom Client | \nWebserver-Konfiguration | \n
| Kontrolle | \nClient (kann gefälscht werden) | \nServeradministrator | \n
| Port | \nEnthält Port, wenn nicht standardmäßig (z. B. site.com:8080) | \n Normalerweise ohne Port (abhängig von UseCanonicalName) | \n
| Zuverlässigkeit | \nNiedrig (nicht ohne Prüfung vertrauen) | \nHoch (aber nicht absolut) | \n
| Verwendung | \nWeiterleitungen, Links für den Benutzer | \nInterne Logik, Sicherheit | \n
Wann was verwenden? Praktische Beispiele
\nKommen wir nun zum Wichtigsten – dem Code. Betrachten wir drei typische Szenarien.
\n\n