HTTP_HOST vs SERVER_NAME en PHP: diferencias clave

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Detective PHP: ¿qué se esconde detrás de HTTP_HOST y SERVER_NAME?

\n\n

Si alguna vez has explorado el array superglobal $_SERVER en PHP, seguro que has visto dos claves muy similares: HTTP_HOST y SERVER_NAME. A simple vista parecen lo mismo — el nombre del servidor. Pero los desarrolladores experimentados saben que el diablo está en los detalles. Este tema ha acumulado miles de visitas en Stack Overflow, y no es casualidad. Elegir mal puede provocar errores en redirecciones, fallos en peticiones entre dominios e incluso vulnerabilidades de seguridad.

\n

En este artículo no solo enumeraremos definiciones aburridas. Vamos a hacer una verdadera investigación: veremos de dónde vienen estos valores, cómo se comportan en diferentes servidores (Apache, Nginx) y, lo más importante, cuándo usar cada uno. Abróchate el cinturón, que esto se pone interesante.

\n\n

¿Qué es HTTP_HOST?

\n

HTTP_HOST es el valor de la cabecera Host que el navegador (o cualquier cliente HTTP) envía al servidor en la petición. Esta cabecera es obligatoria en HTTP/1.1 y contiene el nombre de dominio y, opcionalmente, el puerto.

\n

Ejemplo de petición del navegador:

\n
GET /page.php HTTP/1.1\nHost: pythonlib.es:8080\nUser-Agent: Mozilla/5.0\n...
\n

En PHP, este valor se almacena en $_SERVER['HTTP_HOST']. Atención: es un valor no verificado. El cliente puede enviar cualquier texto en la cabecera Host, por ejemplo, sitio-malicioso.com o 192.168.1.1. Aquí está el verdadero peligro.

\n\n

¿Qué es SERVER_NAME?

\n

SERVER_NAME es el valor que establece el propio servidor web según su configuración. Normalmente se obtiene de la directiva ServerName en Apache o server_name en Nginx. Es el nombre del host virtual que ha procesado la petición.

\n

Ejemplo de configuración Apache:

\n
<VirtualHost *:80>\n    ServerName pythonlib.es\n    DocumentRoot /var/www/pythonlib\n</VirtualHost>
\n

En este caso, $_SERVER['SERVER_NAME'] será pythonlib.es. A diferencia de HTTP_HOST, este valor lo controla el administrador del servidor, no el cliente. Pero hay un matiz: SERVER_NAME puede no incluir el puerto (depende de la configuración UseCanonicalName).

\n\n

Diferencias clave en tabla comparativa

\n

Para que quede más claro, resumimos todo en una tabla:

\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
ParámetroHTTP_HOSTSERVER_NAME
OrigenCabecera HTTP de la petición del clienteConfiguración del servidor web
ControlCliente (puede ser falsificado)Administrador del servidor
PuertoIncluye puerto si no es estándar (ej. sitio.com:8080)Generalmente sin puerto (depende de UseCanonicalName)
FiabilidadBaja (no confíes sin validar)Alta (pero no absoluta)
Uso recomendadoRedirecciones, enlaces para el usuarioLógica interna, seguridad
\n\n

¿Cuándo usar cada uno? Ejemplos prácticos

\n

Ahora vamos a lo importante: el código. Veamos tres escenarios típicos.

\n\n

1. Redirección al mismo dominio (por ejemplo, con www

Blogs

Book Recommendations