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?
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?
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.
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).
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 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.