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 $_SERVER
superglobal 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- host
tê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
). ServerValidator
vé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' host
en-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_POST
et INPUT_SERVER
en 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- host
tê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 ServerName
dans le httpd.conf et, par extension, à la valeur de $_SERVER('SERVER_NAME')
dans le $_SERVER
superglobal. Encore une fois, j'utiliserais INPUT_SERVER
avec les fonctions de filtre PHP, mais vous attrapez ma dérive.
Gardez à l' esprit que Apache utilise fréquemment ServerName
dans 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).