Julian M.: Hotname = Servename

Hallo,
wenn ich bisher über phpinfo() die PHP Servervariablen angesehen habe, habe ich festgestellt, dass die Inhalte von $_SERVER['HTTP_HOST'] und $_SERVER['SERVER_NAME'] immer identisch waren. Ist dies immer so? Oder kann mir jemand ein Beispiel nennen, wo dies nicht der Fall ist.

    • $_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.

      • $_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)

      Besser kann man die Frage nicht beantworten, sehr gut!!!

      Und genau danach richtet sich die Verwendung. Wenn bspw. ein sitemap.xml erzeugt werden soll, nimmt man das was aus der Konfiguration kommt, also SERVER_NAME um das da einzusetzen wo es hingehört.

      Daß der Webserver überhaupt eine Variable HTTP_HOST setzt liegt an dem was der Standard CGI/1.1 definiert: Sämtliche Parameter die einen Request begleiten nachgelagerten Prozessen verfügbar zu machen.

      Die Frage ist also ob ich den Request verarbeiten will oder die Konfiguration.

      MfG

  1. Tach!

    wenn ich bisher über phpinfo() die PHP Servervariablen angesehen habe, habe ich festgestellt, dass die Inhalte von $_SERVER['HTTP_HOST'] und $_SERVER['SERVER_NAME'] immer identisch waren. Ist dies immer so? Oder kann mir jemand ein Beispiel nennen, wo dies nicht der Fall ist.

    Unter Eingabe der beiden Stichwörter in eine Suchmaschine ließ sich die Antwort sehr einfach finden. SERVER_NAME ist das, was beim Apachen als ServerName konfiguriert ist. Das kann pro VHost nur einmal gesetzt sein. Aber ein VHost kann mehrere Aliasnamen haben. Was der Client wirklich angefragt hat, also der Inhalt vom Host-Header, das findet sich in HTTP_HOST. Soweit die Theorie. In der Praxis ist das nur dann so, wenn UseCanonicalName on gesetzt ist, sonst wird der SERVER_NAME mit dem Wert von HTTP_HOST gefüllt.

    dedlfix.

    1. Hallo,
      Eure Ausführungen sind mir zu kompliziert. Ich beschäftige mich erst seit einigen Wochen nebenberuflich mit PHP und noch nicht mit Apache. Ich frage einmal anders. Wenn ich in der Adresszeile angezeigt bekomme "www.irgendwas.de/haferschleim", in welcher der beiden Variablen kann ich den Wert "irgendwas" mit Sicherheit erwarten?

      1. Eure Ausführungen sind mir zu kompliziert … Ich frage einmal anders. Wenn ich in der Adresszeile angezeigt bekomme "www.irgendwas.de/haferschleim", in welcher der beiden Variablen kann ich den Wert "irgendwas" mit Sicherheit erwarten?

        Ich wiederhole:

        • $_SERVER['HTTP_HOST'] - Der Name, der für den Request verwendet wurde. (Im Browser steht er in der Adressleiste)

        Konkret steht bei Deinem Beispiel mit Sicherheit "www.irgendwas.de" in $_SERVER['HTTP_HOST'], nicht nur "irgendwas". Den Domainname "irgendwas" musst Du selbst "parsen".

        1. Ich möchte aber nicht "93.184.216.34" sondern immer "example.com". Dann müsste ich demnach $_SERVER['SERVER_NAME'] verwenden.

          1. Ich möchte aber nicht "93.184.216.34" sondern immer "example.com". Dann müsste ich demnach $_SERVER['SERVER_NAME'] verwenden.

            Ja. Aber das funktioniert nur wenn das auch so konfiguriert ist und unterscheidet sich ganz wesentlich von Deiner eben genannten Anforderung:

            Wenn ich in der Adresszeile angezeigt bekomme "www.irgendwas.de/haferschleim", in welcher der beiden Variablen kann ich den Wert "irgendwas" mit Sicherheit erwarten?

            Du hast also eben quasi nach dem Gegenteil gefragt. Was Du nun wirklich willst weißt nur Du selbst.

            1. Ja. Aber das funktioniert nur wenn das auch so konfiguriert ist und unterscheidet sich ganz wesentlich von Deiner eben genannten Anforderung:

              Ich habe meine Anfrage präzisiert, bevor die hier übliche Frage kam "Was willst Du eigentlich erreichen?" Die Frage kam jetzt indirekt durch Deinen letzten Satz.

              Wenn ich in der Adresszeile angezeigt bekomme "www.irgendwas.de/haferschleim", in welcher der beiden Variablen kann ich den Wert "irgendwas" mit Sicherheit erwarten?

              Du hast also eben quasi nach dem Gegenteil gefragt. Was Du nun wirklich willst weißt nur Du selbst.

              Ich weiß und wußte genau, was ich wollte. Nur fehlte mir die Information, dass in der Adresszeile eines "gängigen" Internet-Auftritts Werte wie "93.184.216.34" vorkommen können. Und ich hoffe doch, dass ich bei der Registrierung einer Domain "www.meineneuedomain.xy" beim ersten Aufruf im Internet NICHT "93.184.216.34" angezeigt bekomme. Also bitte,
              wenn man schon seinen bescheidenen Kenntnisstand hier offenbart, so berücksicht dies in Euren Antworten.
              Danke

              1. Nur fehlte mir die Information, dass in der Adresszeile eines "gängigen" Internet-Auftritts Werte wie "93.184.216.34" vorkommen können.

                Upsalla. Da jetzt PHP bevorzugt für Web verwendet wird gebe ich Dir die Empfehlung das, was Du ingesamt wissen musst und/oder lernen willst in der richtigen Reihenfolge zu lernen.

                Also erst mal "Netzwerk Grundlagen".

      2. Tach!

        Eure Ausführungen sind mir zu kompliziert. Ich beschäftige mich erst seit einigen Wochen nebenberuflich mit PHP und noch nicht mit Apache.

        Das passiert. Ich weiß ja nicht, was dein Wissensstand ist. Wenn du das Thema aber verstehen möchtest, musst du dich zwangsläufig mit dem Apachen und mit HTTP beschäftigen, denn die Unterschiede liegen dort begründet.

        Wie du vielleicht weißt, basiert die Kommunikation im Internet auf TCP/IP. Namen existieren da nicht, nur IP-Adressen. Der Einfachheit halber lasse ich mal die Ports aus dem Spiel. DNS-Namen werden erst zu IP-Adressen aufgelöst und dann läuft alles über diese Adressen ab. Das heißt, dass man pro Ziel-IP immer nur ein Angebot laufen lassen kann, denn wenn IP-Adresse A einen Request erhält, wie soll man da wissen, ob das Angebot A1 oder A2 gemeint ist? Nun wollte und konnte man aber nicht jedem Host/Angebot eine eigene IP-Adresse spendieren und auch nicht jedes Angebot auf einem eigenen physikalischen Host laufen lassen. Zumindest für HTTP hat man das Problem so gelöst, dass Clients einen Header namens Host mitschicken, der den jeweils angefragten Hostnamen enthält, im Beispiel also A1 oder A2. Somit kann der Webserver die Anfragen unterscheiden und zum jeweiligen Host weiterleiten, der nun nur noch virtuell ist (=V-Host), weil eine Software viele Hosts simuliert.

        Nun kann es aber auch noch sein, dass man innerhalb eines VHosts zusätzlich zum ServerName, also dem Namen des VHosts, mehrere Aliasnamen vergeben kann. Damit kann man dann neben dem Angebote A1 die Unterangebote A11, A12, und so weiter, bereitstellen. Und wenn du nun unterscheiden möchtest, welches Angebot nun konkret angefragt wurden, kannst du in HTTP_HOST schauen, denn dort landet der vom Client mitgegebene Wert aus dem Host-Header.

        Wenn ich in der Adresszeile angezeigt bekomme "www.irgendwas.de/haferschleim", in welcher der beiden Variablen kann ich den Wert "irgendwas" mit Sicherheit erwarten?

        HTTP_HOST in jedem Fall. Der Apache schreibt diesen Wert aber auch nach SERVER_NAME, was eigentlich der VHost-Name und nicht der angefragte Alias sein sollte. Also zumindest in Abhängigkeit von der Konfiguration UseCanonicalName. Das heißt also, dein gesuchter Wert ist garantiert in HTTP_HOST, kann aber auch ohne Garantie in SERVER_NAME stehen.

        dedlfix.

        1. Tach!

          Eure Ausführungen sind mir zu kompliziert. Ich beschäftige mich erst seit einigen Wochen nebenberuflich mit PHP und noch nicht mit Apache.

          Das passiert. Ich weiß ja nicht, was dein Wissensstand ist. Wenn du das Thema aber verstehen möchtest, musst du dich zwangsläufig mit dem Apachen und mit HTTP beschäftigen, denn die Unterschiede liegen dort begründet.

          Für ein (für mich) triviales Problem, den zitierten Namen zu erhalten, muss ich mich doch hoffentlich nicht in den Apache einarbeiten. Die Antwort habe ich ja jetzt erhalten, wofür ich Euch danke. Wenn dies über Umwege führte, liegt einzig daran, dass mir Basiswissen fehlte, um die Frage exakt zu formulieren. Wie geschrieben, war mir unbekannt, dass auch "93.184.216.34" als Angaben in der Adresszeile vorkommen.

          1. Tach!

            Wie geschrieben, war mir unbekannt, dass auch "93.184.216.34" als Angaben in der Adresszeile vorkommen.

            Jein. Das klappt so nur bei dedizierten Hosts, also da, wo unter einer IP-Adresse lediglich ein einzelnes Angebot vorhanden ist. Liegt dein Angebot aber als eins von vielen in einem VHost auf einem gemeinsamen Server unter derselben IP-Adresse, dann kann der Server den Request nicht zu dir weiterleiten, wenn der Hostname fehlt. Der Request landet dann im Default-VHost. In dem Fall kannst du also keine IP-Adresse sehen, weil du gar nicht behelligt wirst.

            Unabhängig davon kannst du natürlich auch die IP-Adresse des Servers in SERVER_ADDR abfragen, aber das bringt dich auch nicht weiter.

            dedlfix.