579 Stimmen

Was ist der Unterschied zwischen HTTP_HOST und SERVER_NAME in PHP?

Was ist der Unterschied zwischen $_SERVER['HTTP_HOST'] y $_SERVER['SERVER_NAME'] in PHP?

Wann würden Sie das eine dem anderen vorziehen und warum?

6voto

Rowland Shaw Punkte 37027

Das hängt davon ab, was ich herausfinden möchte. SERVER_NAME ist der Hostname des Servers, während HTTP_HOST der virtuelle Host ist, mit dem sich der Client verbunden hat.

4voto

Vitalie Punkte 66

$_SERVER['SERVER_NAME'] hängt von der Konfiguration Ihres Webservers ab. $_SERVER['HTTP_HOST'] basiert auf der Anfrage des Kunden.

2voto

Dominic108 Punkte 41

Ich habe eine Weile gebraucht, um zu verstehen, was die Leute mit SERVER_NAME zuverlässiger ist". Ich verwende einen gemeinsam genutzten Server und habe keinen Zugang zu den Richtlinien für virtuelle Hosts. Ich verwende also mod_rewrite in .htaccess zur Abbildung verschiedener HTTP_HOST s in verschiedene Verzeichnisse. In diesem Fall ist es HTTP_HOST das sinnvoll ist.

Die Situation ist ähnlich, wenn man namensbasierte virtuelle Hosts verwendet: Die ServerName Direktive innerhalb eines virtuellen Hosts gibt einfach an, welcher Hostname diesem virtuellen Host zugeordnet werden soll. Das Fazit ist, dass in beiden Fällen der vom Client bei der Anfrage angegebene Hostname ( HTTP_HOST ), muss mit einem Namen innerhalb des Servers abgeglichen werden, der wiederum einem Verzeichnis zugeordnet ist. Ob die Zuordnung mit Richtlinien für virtuelle Hosts oder mit htaccess mod_rewrite-Regeln erfolgt, ist hier zweitrangig. In diesen Fällen, HTTP_HOST ist dasselbe wie SERVER_NAME . Ich bin froh, dass Apache auf diese Weise konfiguriert ist.

Bei IP-basierten virtuellen Hosts ist die Situation jedoch anders. In diesem Fall und nur in diesem Fall, SERVER_NAME y HTTP_HOST kann anders sein, denn jetzt wählt der Client den Server über die IP und nicht über den Namen aus. In der Tat kann es spezielle Konfigurationen geben, bei denen dies wichtig ist.

Von nun an werde ich also Folgendes verwenden SERVER_NAME nur für den Fall, dass mein Code in diesen speziellen Konfigurationen portiert wird.

2voto

Anthony Rutledge Punkte 5794

Angenommen, man hat eine einfache Einrichtung (CentOS 7, Apache 2.4.x und PHP 5.6.20) und nur eine Website (ohne virtuelles Hosting) ...

Im Sinne von PHP, $_SERVER['SERVER_NAME'] ist ein Element, das PHP in der Datei $_SERVER superglobal auf der Grundlage Ihrer Apache-Konfiguration ( **ServerName** Richtlinie mit UseCanonicalName On ) in httpd.conf (sei es aus einer eingebundenen virtuellen Host-Konfigurationsdatei, was auch immer, etc ...). HTTP_HOST ist abgeleitet von der HTTP host Kopfzeile. Behandeln Sie diese als Benutzereingabe. Filtern und validieren Sie vor der Verwendung.

Hier ist ein Beispiel, wo ich $_SERVER['SERVER_NAME'] als Grundlage für einen Vergleich. Die folgende Methode stammt aus einer von mir erstellten konkreten Unterklasse namens ServerValidator (Kind von Validator ). ServerValidator prüft sechs oder sieben Elemente in $_SERVER, bevor es sie verwendet.

Um festzustellen, ob die HTTP-Anforderung POST ist, verwende ich diese Methode.

public function isPOST()
{
    return (($this->requestMethod === 'POST')    &&  // Ignore
            $this->hasTokenTimeLeft()            &&  // Ignore
            $this->hasSameGETandPOSTIdentities() &&  // Ingore
            ($this->httpHost === filter_input(INPUT_SERVER, 'SERVER_NAME')));
}

Zu dem Zeitpunkt, an dem diese Methode aufgerufen wird, sind alle Filterungen und Validierungen der relevanten $_SERVER-Elemente bereits erfolgt (und die relevanten Eigenschaften gesetzt).

Die Linie ...

($this->httpHost === filter_input(INPUT_SERVER, 'SERVER_NAME')

... prüft, ob die $_SERVER['HTTP_HOST'] Wert (letztlich abgeleitet von der angeforderten host HTTP-Header) entspricht $_SERVER['SERVER_NAME'] .

Ich verwende jetzt die superglobale Sprache, um mein Beispiel zu erläutern, aber nur, weil einige Leute nicht mit der Sprache vertraut sind. INPUT_GET , INPUT_POST y INPUT_SERVER in Bezug auf filter_input_array() .

Die Quintessenz ist, dass ich keine POST-Anfragen auf meinem Server bearbeite, es sei denn todo vier Bedingungen erfüllt sind. In Bezug auf POST-Anfragen bedeutet dies, dass die Nichtbereitstellung eines HTTP host Kopfzeile (Vorhandensein früher getestet) Zaubersprüche Untergang für strenge HTTP 1.0 Brauen. Außerdem wird der angeforderte Host muss mit dem Wert para ServerName im httpd.conf und damit auch der Wert für $_SERVER('SERVER_NAME') im $_SERVER superglobal. Auch hier würde ich die INPUT_SERVER mit den PHP-Filterfunktionen, aber Sie verstehen, worauf ich hinaus will.

Beachten Sie, dass der Apache häufig die ServerName en Standard-Weiterleitungen (z. B. das Weglassen des Schrägstrichs am Ende einer URL: Beispiel, http://www.example.com werden. http://www.example.com/ ), auch wenn Sie keine URL-Umschreibung verwenden.

Ich benutze $_SERVER['SERVER_NAME'] als Standard, nicht $_SERVER['HTTP_HOST'] . In dieser Frage gibt es ein ständiges Hin und Her. $_SERVER['HTTP_HOST'] könnte leer sein, daher sollte dies nicht die Grundlage für die Erstellung von Code-Konventionen wie meine obige öffentliche Methode sein. Aber nur weil beide gesetzt sein können, heißt das noch lange nicht, dass sie auch gleich sind. Testen ist der beste Weg, um sicher zu sein (unter Berücksichtigung der Apache-Version und der PHP-Version).

0voto

MSS Punkte 3168

Wie balusC sagte, ist SERVER_NAME nicht zuverlässig und kann in der Apache-Konfiguration, der Servernamen-Konfiguration des Servers und der Firewall, die zwischen Ihnen und dem Server stehen kann, geändert werden.

Die folgende Funktion gibt immer den echten Host (vom Benutzer eingegebener Host) ohne Port zurück und ist nahezu zuverlässig:

function getRealHost(){
   list($realHost,)=explode(':',$_SERVER['HTTP_HOST']);
   return $realHost;
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X