Angenommen, man hat ein einfaches Setup (CentOS 7, Apache 2.4.x und PHP 5.6.20) und nur eine Website (ohne virtuelles Hosting) ...
Im PHP-Sinne $_SERVER['SERVER_NAME']
ist ein Element, das PHP im $_SERVER
Superglobal registriert, basierend auf Ihrer Apache-Konfiguration ( **ServerName**
Direktive mit UseCanonicalName On
) in httpd.conf (sei es aus einer enthaltenen Konfigurationsdatei des virtuellen Hosts, was auch immer usw.). HTTP_HOST wird vom HTTP abgeleitethost
Header abgeleitet. Behandeln Sie dies als Benutzereingabe. Filtern und validieren Sie vor der Verwendung.
Hier ist ein Beispiel, wo ich $_SERVER['SERVER_NAME']
als Grundlage für einen Vergleich verwende. Die folgende Methode stammt aus einer konkreten untergeordneten Klasse, die ich mit dem Namen ServerValidator
(child of Validator
) erstellt habe. ServerValidator
Überprüft sechs oder sieben Elemente in $ _SERVER, bevor sie verwendet werden.
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')));
}
Zum Zeitpunkt des Aufrufs dieser Methode wären alle Filter und Validierungen der relevanten $ _SERVER-Elemente erfolgt (und die relevanten Eigenschaften wurden festgelegt).
Die Linie ...
($this->httpHost === filter_input(INPUT_SERVER, 'SERVER_NAME')
... prüft, ob der $_SERVER['HTTP_HOST']
Wert (der letztendlich aus dem angeforderten host
HTTP-Header abgeleitet wurde) übereinstimmt $_SERVER['SERVER_NAME']
.
Nun, ich bin mit Superglobal sprechen , mein Beispiel zu erklären, aber das ist nur , weil einige Menschen sind nicht vertraut mit INPUT_GET
, INPUT_POST
und INPUT_SERVER
in Bezug auf filter_input_array()
.
Unter dem Strich verarbeite ich POST-Anfragen auf meinem Server nur, wenn alle vier Bedingungen erfüllt sind. In Bezug auf POST-Anforderungen bedeutet das Versagen der Bereitstellung eines HTTP- host
Headers (auf frühere Tests getestet) für strenge HTTP 1.0- Browser das Schicksal . Darüber hinaus ist der angeforderte Host muss mit dem Wert übereinstimmen für in der httpd.conf , und durch Erweiterung, um den Wert für die in der Superglobal. Wieder würde ich mit den PHP-Filterfunktionen verwenden, aber Sie fangen meine Drift.ServerName
$_SERVER('SERVER_NAME')
$_SERVER
INPUT_SERVER
Beachten Sie, dass Apache häufig ServerName
in Standardumleitungen verwendet wird (z. B. wenn der nachfolgende Schrägstrich von einer URL entfernt wird: Beispiel: http://www.foo.com wird zu http://www.foo.com/ ), auch wenn dies nicht der Fall ist Verwenden der URL-Umschreibung.
Ich benutze $_SERVER['SERVER_NAME']
als Standard nicht $_SERVER['HTTP_HOST']
. Zu diesem Thema gibt es viel Hin und Her. $_SERVER['HTTP_HOST']
könnte leer sein, daher sollte dies nicht die Grundlage für die Erstellung von Codekonventionen wie meiner oben beschriebenen öffentlichen Methode sein. Nur weil beide festgelegt werden können, ist dies jedoch keine Garantie dafür, dass sie gleich sind. Testen ist der beste Weg, um sicher zu wissen (unter Berücksichtigung der Apache-Version und der PHP-Version).