Saltar al contenido

¿Cuál es la diferencia entre HTTP_HOST y SERVER_NAME en PHP?

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 el ServerName, 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 el ServerName 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_HOSTel valor de SERVER_NAMEque 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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *