W3docs

$_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

ClaveQué 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_AGENT y cualquier otra clave HTTP_* son simplemente cabeceras de solicitud — un cliente malicioso puede enviar cualquier cosa. Nunca las imprimas en HTML sin escaparlas (usa htmlspecialchars()), y valida HTTP_HOST contra una lista de permitidos antes de usarlo en una redirección.
  • PHP_SELF puede contener datos de ruta inyectados y es una fuente clásica de cross-site scripting (XSS) cuando se imprime en el atributo action de un formulario. Escápalo.
  • REMOTE_ADDR es 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 de REMOTE_ADDR para 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.

Práctica

Práctica
¿Qué información puede proporcionar la superglobal $_SERVER de PHP?
¿Qué información puede proporcionar la superglobal $_SERVER de PHP?
Was this page helpful?