- $_SERVER['SERVER_NAME'] - Der Name aus der Konfiguration des Webservers.
- $_SERVER['HTTP_HOST'] - Der Name, der für den Request verwendet wurde. (Im Browser steht er in der Adressleiste)
Wenn ein Server "example.com" z.B. gar nicht erst in virtuelle Server aufgeteilt ist, dann wird landet der Request für http://example.com, aber auch der auf dessen IP-Adresse http://93.184.216.34 beim gleichen Server.
$_SERVER['SERVER_NAME'] bleibt dann (wohl) "example.com", $_SERVER['HTTP_HOST'] ist dann je nach Request aber mal "example.com", mal "93.184.216.34".
Wenn jetzt jemand hingeht und einen DNS-Eintrag oder einen Hosts-Eintrag schafft, demzufolge auch foo.bar auf die IP 93.184.216.34 verweisen, dann kann $_SERVER['HTTP_HOST'] auch "foo.bar" lauten. $_SERVER['SERVER_NAME'] bleibt dann ebenfalls (wohl) "example.com".
Weiteres Beispiel:
In der Apache-Konfiguaration wurde example.com als Servername und www.example.com als Alias definiert. Beide verweisen auf die IP 93.184.216.34. Bei einem Abruf von https://example.com und https://www.example.com wird also auch der gleiche virtuelle Server adressiert. $_SERVER['SERVER_NAME'] bleibt dann (wohl) example.com, $_SERVER['HTTP_HOST'] kann example.com oder www.example.com sein.
Warum der Unterschied? Es gibt für Programmierer und Admins manchmal Gründe das wissen zu wollen.
(wohl): Was weiß denn ich wie der Server von der IANA konfiguriert wurde. Außenstehende können das nicht erkennen.