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 $_SERVER
superglobal 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
). ServerValidator
comprueba 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 host
encabezado 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_POST
y INPUT_SERVER
en 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 host
encabezado 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 ServerName
en el httpd.conf , y, por extensión, el valor de $_SERVER('SERVER_NAME')
la $_SERVER
superglobal. Una vez más, estaría usando INPUT_SERVER
las funciones de filtro de PHP, pero me entiendes.
Tenga en cuenta que Apache usa con frecuencia ServerName
en 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).