Te damos la bienvenida a nuestro sitio web, ahora vas a encontrar la solucíon de lo que buscabas.
Solución:
Él HTTP_HOST
se obtiene del encabezado de la solicitud HTTP y esto es lo que el cliente realmente usó como “host de destino” de la solicitud. Él SERVER_NAME
se define en la configuración del servidor. Cuál usar depende de para qué lo necesites. Sin embargo, ahora debe darse cuenta de que uno es un valor controlado por el cliente que, por lo tanto, puede no ser confiable para su uso en la lógica empresarial y el otro es un valor controlado por el servidor que es más confiable. Sin embargo, debe asegurarse de que el servidor web en cuestión tenga la SERVER_NAME
configurado correctamente. Tomando Apache HTTPD como ejemplo, aquí hay un extracto de su documentación:
Si no
ServerName
se especifica, luego el servidor intenta deducir el nombre de host realizando una búsqueda inversa en la dirección IP. Si no se especifica ningún puerto en elServerName
, entonces el servidor usará el puerto de la solicitud entrante. Para una confiabilidad y previsibilidad óptimas, debe especificar un nombre de host y un puerto explícitos mediante elServerName
directiva.
Actualizar: después de verificar la respuesta de Pekka en su pregunta que contiene un enlace a la respuesta de bobince que PHP siempre devolvería HTTP_HOST
el valor de SERVER_NAME
que va en contra de mis propias experiencias PHP 4.x + Apache HTTPD 1.2.x de hace un par de años, soplé un poco de polvo de mi entorno XAMPP actual en Windows XP (Apache HTTPD 2.2.1 con PHP 5.2.8), comencé it, creó una página PHP que imprime los dos valores, creó una aplicación de prueba Java usando URLConnection
para modificar el Host
El encabezado y las pruebas me enseñaron que este es (incorrectamente) el caso.
Después de sospechar por primera vez de PHP y buscar en algunos informes de errores de PHP relacionados con el tema, me enteré de que la raíz del problema está en el servidor web utilizado, que devolvió HTTP incorrectamente Host
encabezado cuando SERVER_NAME
fué solicitado. Así que busqué en los informes de errores de Apache HTTPD usando varias palabras clave relacionadas con el tema y finalmente encontré un error relacionado. Este comportamiento se introdujo alrededor de Apache HTTPD 1.3. Necesitas configurar UseCanonicalName
directiva a on
en el
entrada de la ServerName
en httpd.conf
(¡Revise también la advertencia en la parte inferior del documento!).
ServerName example.com
UseCanonicalName on
Esto funcionó para mí.
Resumido, SERVER_NAME
es más fiable, pero eres dependiente en la configuración del servidor!
HTTP_HOST
es el host de destino enviado por el cliente. Puede ser manipulado libremente por el usuario. No hay problema para enviar una solicitud a su sitio solicitando un HTTP_HOST
valor de www.stackoverflow.com
.
SERVER_NAME
viene del servidor VirtualHost
definición y por lo tanto se considera más fiable. Sin embargo, también puede ser manipulado desde el exterior bajo ciertas condiciones relacionadas con la configuración de su servidor web: Ver esto Esta pregunta SO que se ocupa de los aspectos de seguridad de ambas variaciones.
No debe confiar en ninguno de los dos para estar seguro. Dicho esto, qué usar realmente depende de lo que quieras hacer. Si desea determinar en qué dominio se está ejecutando su secuencia de comandos, puede utilizar de forma segura HTTP_HOST
siempre que los valores no válidos provenientes de un usuario malicioso no puedan romper nada.
Como mencioné en esta respuesta, si el servidor se ejecuta en un puerto que no sea el 80 (como podría ser común en una máquina de desarrollo/intranet), entonces HTTP_HOST
contiene el puerto, mientras que SERVER_NAME
no es.
$_SERVER['HTTP_HOST'] == 'localhost:8080'
$_SERVER['SERVER_NAME'] == 'localhost'
(Al menos eso es lo que he notado en los hosts virtuales basados en puertos de Apache)
Tenga en cuenta que HTTP_HOST
hace no Contiene :443
cuando se ejecuta en HTTPS (a menos que esté ejecutando en un puerto no estándar, que no he probado).
Como han señalado otros, los dos también difieren cuando se usa IPv6:
$_SERVER['HTTP_HOST'] == '[::1]'
$_SERVER['SERVER_NAME'] == '::1'
Sección de Reseñas y Valoraciones
Ten en cuenta dar difusión a esta crónica si si solucionó tu problema.