Suponiendo que uno tiene una configuración simple (CentOS 7, Apache 2.4.xy PHP 5.6.20) y solo un sitio web (sin asumir el alojamiento virtual) ...
En el sentido de PHP, $_SERVER['SERVER_NAME']es un elemento que PHP registra en el $_SERVERsuperglobal basado en su configuración de Apache ( **ServerName**directiva con UseCanonicalName On) en httpd.conf (ya sea desde un archivo de configuración de host virtual incluido, lo que sea, etc.). HTTP_HOST se deriva del HTTPhost encabezado . Tratar esto como entrada del usuario. Filtrar y validar antes de usar.
Aquí hay un ejemplo de dónde lo uso $_SERVER['SERVER_NAME']como base para una comparación. El siguiente método es de una clase secundaria concreta que hice nombrada ServerValidator(child of Validator). ServerValidatorcomprueba seis o siete elementos en $ _SERVER antes de usarlos.
Al determinar si la solicitud HTTP es POST, utilizo este método.
public function isPOST()
{
return (($this->requestMethod === 'POST') && // Ignore
$this->hasTokenTimeLeft() && // Ignore
$this->hasSameGETandPOSTIdentities() && // Ingore
($this->httpHost === filter_input(INPUT_SERVER, 'SERVER_NAME')));
}
Para cuando se llame a este método, todo el filtrado y la validación de los elementos relevantes de $ _SERVER habrían ocurrido (y el conjunto de propiedades relevantes).
La línea ...
($this->httpHost === filter_input(INPUT_SERVER, 'SERVER_NAME')
... comprueba que el $_SERVER['HTTP_HOST']valor (derivado en última instancia del hostencabezado HTTP solicitado ) coincida $_SERVER['SERVER_NAME'].
Ahora, estoy usando hablan superglobal para explicar mi ejemplo, pero eso es sólo porque algunas personas no están familiarizados con INPUT_GET, INPUT_POSTy INPUT_SERVERen lo que respecta a filter_input_array().
La conclusión es, yo no manejo peticiones POST en mi servidor a menos que todos se cumplan cuatro condiciones. Por lo tanto, en términos de solicitudes POST, el hecho de no proporcionar un hostencabezado HTTP (presencia probada para antes) significa fatalidad para los navegadores HTTP 1.0 estrictos . Por otra parte, el host solicitado debe coincidir con el valor de ServerNameen el httpd.conf , y, por extensión, el valor de $_SERVER('SERVER_NAME')la $_SERVERsuperglobal. Una vez más, estaría usando INPUT_SERVERlas funciones de filtro de PHP, pero me entiendes.
Tenga en cuenta que Apache usa con frecuencia ServerNameen redirecciones estándar (como dejar la barra diagonal fuera de una URL: por ejemplo, http://www.foo.com convirtiéndose en http://www.foo.com/ ), incluso si no está usando la reescritura de URL.
Yo uso $_SERVER['SERVER_NAME']como estándar, no $_SERVER['HTTP_HOST']. Hay mucho de ida y vuelta en este tema. $_SERVER['HTTP_HOST']podría estar vacío, por lo que esta no debería ser la base para crear convenciones de código como mi método público anterior. Pero, el hecho de que ambos se puedan configurar no garantiza que sean iguales. La prueba es la mejor manera de saberlo con certeza (teniendo en cuenta la versión de Apache y la versión de PHP).