$_SERVER
PHP es un lenguaje popular del lado del servidor. Aprende a usar la superglobal $_SERVER para acceder a cabeceras, rutas y más.
Entendiendo las superglobales de PHP y la variable $_SERVER
PHP es un lenguaje de scripting del lado del servidor muy popular usado en el desarrollo web. Una de sus características es el conjunto de superglobales — variables integradas que siempre están disponibles en cualquier ámbito, por lo que nunca necesitas declararlas con la palabra clave global. Este artículo se centra en la superglobal $_SERVER: qué contiene, las claves que más usarás y cómo leerla de forma segura.
Para una visión general de todas las superglobales ($_GET, $_POST, $_SESSION, $_COOKIE y más), consulta Superglobales de PHP.
¿Qué es la variable $_SERVER?
$_SERVER es un array asociativo que el servidor web rellena en cada solicitud. Contiene información sobre el servidor, el script actual y la solicitud HTTP entrante — cabeceras, rutas, el método de solicitud, la dirección IP del visitante y algunas variables de entorno del sistema.
Como es un array, lees piezas individuales de información por clave, por ejemplo $_SERVER['REQUEST_METHOD'].
Claves de uso más frecuente
| Clave | Qué devuelve |
|---|---|
$_SERVER['REQUEST_METHOD'] | El método HTTP de la solicitud (GET, POST, PUT, …). |
$_SERVER['REQUEST_URI'] | La ruta y cadena de consulta de la URL solicitada, p. ej. /products?id=5. |
$_SERVER['QUERY_STRING'] | Solo la parte de cadena de consulta de la URL, p. ej. id=5. |
$_SERVER['HTTP_HOST'] | El host (y puerto) de la cabecera Host de la solicitud. |
$_SERVER['SERVER_NAME'] | El nombre de host tal como está configurado en el propio servidor. |
$_SERVER['HTTPS'] | No vacío cuando la solicitud se realizó sobre HTTPS. |
$_SERVER['REMOTE_ADDR'] | La dirección IP desde la que parece provenir la solicitud. |
$_SERVER['HTTP_USER_AGENT'] | La cabecera User-Agent del cliente (identidad del navegador/bot). |
$_SERVER['HTTP_REFERER'] | La URL de la página que enlazó al script actual, si existe. |
$_SERVER['SCRIPT_FILENAME'] | Ruta absoluta del sistema de archivos del script en ejecución. |
$_SERVER['DOCUMENT_ROOT'] | Directorio raíz del documento configurado para el sitio. |
$_SERVER['PHP_SELF'] | Ruta del script actual relativa al directorio raíz del documento. |
$_SERVER['SERVER_PROTOCOL'] | Protocolo de la solicitud, p. ej. HTTP/1.1. |
Nota: Las claves presentes dependen del servidor web (Apache, Nginx + PHP-FPM, el servidor CLI integrado, …). En la línea de comandos, muchas claves relacionadas con la solicitud están completamente ausentes. Lee siempre con cuidado — consulta la sección de seguridad más abajo.
Inspeccionando $_SERVER
Cuando no estás seguro de qué proporciona un entorno determinado, vuelca el array completo:
<?php
echo '<pre>';
print_r($_SERVER);
echo '</pre>';Esto imprime cada par clave/valor que el servidor puso a disposición para la solicitud actual, que es la forma más rápida de descubrir en qué puedes confiar.
Bifurcando según el método de solicitud
Un uso muy habitual de $_SERVER es decidir qué hacer según cómo se solicitó la página. Una página de formulario, por ejemplo, muestra el formulario en una solicitud GET y procesa los datos enviados en una solicitud POST:
<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
// Handle the submitted form data (validate, save, …)
echo 'Processing your submission';
} else {
// First visit — show the empty form
echo 'Showing the form';
}Este patrón es la base del manejo de formularios en PHP. Consulta Manejo de formularios PHP y Validación de formularios PHP para el flujo de trabajo completo.
Construyendo una URL de redirección
La función header() envía una cabecera HTTP sin procesar — incluyendo la cabecera Location usada para redirecciones. $_SERVER es útil para construir el destino dinámicamente, por ejemplo forzando HTTPS para la solicitud actual:
<?php
// Redirect to the HTTPS version of the same URL when the request is plain HTTP
if (empty($_SERVER['HTTPS'])) {
$url = 'https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
header('Location: ' . $url, true, 301);
exit;
}header() debe llamarse antes de que se envíe cualquier salida (HTML, echo, o incluso una línea en blanco) al navegador. La sentencia exit detiene el script para que no se produzca más contenido después de la cabecera de redirección.
Usando $_SERVER para el manejo de errores
Otro uso de la variable $_SERVER es el manejo de errores. Por ejemplo, puedes usar el siguiente código para mostrar una página de error personalizada para errores 404:
Manejo de errores 404 en PHP con $_SERVER
<?php
// Log the error URI using $_SERVER
error_log('404 Error: ' . $_SERVER['REQUEST_URI']);
http_response_code(404);
include '404.html';
?>En este ejemplo, $_SERVER['REQUEST_URI'] se usa para capturar la ruta solicitada con fines de registro. En lugar de redirigir, el script establece el código de estado HTTP correcto e incluye una plantilla personalizada, que es la práctica estándar para manejar errores.
Seguridad: no confíes en los valores controlados por el cliente
Algunas claves de $_SERVER provienen de la solicitud y están totalmente controladas por el cliente, por lo que pueden ser falsificadas. Trátalas como entrada no confiable:
HTTP_HOST,HTTP_REFERER,HTTP_USER_AGENTy cualquier otra claveHTTP_*son simplemente cabeceras de solicitud — un cliente malicioso puede enviar cualquier cosa. Nunca las imprimas en HTML sin escaparlas (usahtmlspecialchars()), y validaHTTP_HOSTcontra una lista de permitidos antes de usarlo en una redirección.PHP_SELFpuede contener datos de ruta inyectados y es una fuente clásica de cross-site scripting (XSS) cuando se imprime en el atributoactionde un formulario. Escápalo.REMOTE_ADDRes la dirección de conexión; detrás de un proxy o balanceador de carga, la IP real del cliente puede estar en una cabecera diferente. No dependas únicamente deREMOTE_ADDRpara decisiones de seguridad.
Una forma segura de comprobar si falta una clave sin generar una advertencia es el operador de fusión nula:
<?php
$method = $_SERVER['REQUEST_METHOD'] ?? 'GET';
echo $method;Esto evita una advertencia de "clave de array indefinida" cuando la clave no está establecida (por ejemplo, al ejecutarse bajo la CLI).
Conclusión
La superglobal $_SERVER da a los scripts PHP acceso a los detalles de la solicitud y el entorno — el método HTTP, la URL solicitada, el host, las rutas y la IP del visitante. Impulsa tareas cotidianas como el manejo de formularios basado en el método, las redirecciones y el registro de errores. Recuerda que las claves derivadas de cabeceras están controladas por el cliente: valídalas y escápalas antes de usarlas.
Para profundizar, explora las superglobales relacionadas: $_GET, $_POST y $_REQUEST.
Nota: En PHP moderno, la etiqueta de cierre ?> es opcional y a menudo se omite para evitar salidas accidentales de espacios en blanco.