En supposant qu'un a une configuration simple (CentOS 7, Apache 2.4.x et PHP 5.6.20) et un seul site Web (ne supposant pas d'hébergement virtuel) ...
Au sens PHP, $_SERVER['SERVER_NAME']est un élément que PHP enregistre dans le $_SERVERsuperglobal en fonction de votre configuration Apache ( **ServerName**directive avec UseCanonicalName On) dans httpd.conf (que ce soit à partir d'un fichier de configuration d'hôte virtuel inclus, peu importe, etc ...). HTTP_HOST est dérivé de l'en- hosttête HTTP . Traitez cela comme une entrée utilisateur. Filtrez et validez avant d'utiliser.
Voici un exemple où j'utilise $_SERVER['SERVER_NAME']comme base pour une comparaison. La méthode suivante est issue d'une classe enfant concrète que j'ai créée nommée ServerValidator(enfant de Validator). ServerValidatorvérifie six ou sept éléments dans $ _SERVER avant de les utiliser.
Pour déterminer si la requête HTTP est POST, j'utilise cette méthode.
public function isPOST()
{
return (($this->requestMethod === 'POST') && // Ignore
$this->hasTokenTimeLeft() && // Ignore
$this->hasSameGETandPOSTIdentities() && // Ingore
($this->httpHost === filter_input(INPUT_SERVER, 'SERVER_NAME')));
}
Au moment où cette méthode est appelée, tous les filtrages et validations des éléments $ _SERVER pertinents se seraient produits (et les propriétés pertinentes définies).
La ligne ...
($this->httpHost === filter_input(INPUT_SERVER, 'SERVER_NAME')
... vérifie que la $_SERVER['HTTP_HOST']valeur (finalement dérivée de l' hosten-tête HTTP demandé ) correspond $_SERVER['SERVER_NAME'].
Maintenant, je me sers de parler superglobale pour expliquer mon exemple, mais c'est juste parce que certaines personnes ne connaissent pas INPUT_GET, INPUT_POSTet INPUT_SERVERen ce qui concerne filter_input_array().
L'essentiel est que je ne traite pas les demandes POST sur mon serveur à moins que les quatre conditions ne soient remplies. Par conséquent, en termes de requêtes POST, le fait de ne pas fournir un en- hosttête HTTP (présence testée pour plus tôt) est fatal pour les navigateurs HTTP 1.0 stricts . De plus, l'hôte demandé doit correspondre à la valeur de ServerNamedans le httpd.conf et, par extension, à la valeur de $_SERVER('SERVER_NAME')dans le $_SERVERsuperglobal. Encore une fois, j'utiliserais INPUT_SERVERavec les fonctions de filtre PHP, mais vous attrapez ma dérive.
Gardez à l' esprit que Apache utilise fréquemment ServerNamedans standards réoriente ( par exemple en laissant le slash hors URL: Exemple, http://www.foo.com devenir http://www.foo.com/ ), même si vous n'êtes pas en utilisant la réécriture d'URL.
J'utilise $_SERVER['SERVER_NAME']comme standard, non $_SERVER['HTTP_HOST']. Il y a beaucoup de va-et-vient sur cette question. $_SERVER['HTTP_HOST']pourrait être vide, donc cela ne devrait pas être la base pour créer des conventions de code telles que ma méthode publique ci-dessus. Mais, tout simplement parce que les deux peuvent être définis ne garantit pas qu'ils seront égaux. Le test est le meilleur moyen de savoir avec certitude (en gardant à l'esprit la version Apache et la version PHP).