HOWTO · PHP
Obtener la URL actual completa en PHP
Este tutorial presenta cómo obtener la URL actual en PHP
En esta página
Para consultar o construir la URL de la solicitud actual de PHP, combina el esquema, el host y el URI de la solicitud. Esto resulta útil para mostrar una página según los parámetros de consulta o registrar la dirección solicitada. Una URL construida es solo un dato: para usarla en una redirección, también debes decidir qué destinos están permitidos.
Construir la URL actual a partir de los datos de la solicitud
PHP no proporciona un único valor $_SERVER que siempre represente la URL actual completa. El servidor expone partes de la información de la solicitud, y tu aplicación combina las que necesita. En una solicitud web habitual, el esquema es http o https, el host puede incluir un puerto y el URI de la solicitud contiene la ruta y la cadena de consulta.
Leer el esquema, el host y el URI de la solicitud desde $_SERVER
$_SERVER es una matriz superglobal que rellenan el servidor web y el entorno de ejecución. $_SERVER['HTTP_HOST'] proporciona el host solicitado, mientras que $_SERVER['REQUEST_URI'] suele proporcionar la ruta y la cadena de consulta. Ninguno de esos valores es una URL completa por sí solo. El host procede de la solicitud entrante, así que considéralo una entrada no confiable: valídalo frente a una lista de hosts conocidos antes de utilizarlo en contenido sensible para la seguridad, como una redirección o un enlace absoluto en un correo electrónico.
Gestionar HTTPS y las solicitudes detrás de un proxy
Cuando PHP recibe la solicitud directamente mediante TLS, es habitual que $_SERVER['HTTPS'] tenga un valor no vacío, como on. Comprueba ese valor antes de elegir el esquema; no des por sentado que todos los servidores lo establecen de la misma manera. También puede estar disponible $_SERVER['REQUEST_SCHEME'], pero su disponibilidad y significado dependen de la configuración del servidor.
En una implementación con un proxy inverso, el navegador puede conectarse mediante HTTPS mientras el proxy se conecta a PHP mediante HTTP. En ese caso, el valor de HTTPS de la conexión directa puede describir únicamente la conexión entre el proxy y PHP. Una cabecera que indique el esquema reenviado solo puede ser útil si la aplicación está detrás de un proxy de confianza configurado específicamente para eliminar o reemplazar las copias enviadas por el cliente. No confíes en cabeceras reenviadas de solicitudes arbitrarias. Configura esa confianza tanto en el proxy como en la aplicación, o utiliza el esquema que el servidor proporcione de forma fiable.
Incluir la ruta y la cadena de consulta
$_SERVER['REQUEST_URI'] suele contener un valor como /products.php?category=books&page=2; al añadirlo, se conservan tanto la ruta como la cadena de consulta. No incluye el esquema ni el host. La cadena de consulta puede contener datos privados o sensibles, así que considera si corresponde incluirla en registros, en el contenido de una página o en una URL enviada por correo electrónico. No trates un URI de solicitud como una URL canónica sin tener en cuenta el enrutamiento de tu aplicación y la configuración de la implementación.
Elegir un método y comprobar el resultado
Para una solicitud normal gestionada directamente por el servidor web, combina explícitamente los valores del servidor. Este ejemplo autónomo utiliza valores representativos de una solicitud para mostrar cómo se construye la URL. No se ha ejecutado durante esta etapa de redacción:
El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.
<?php
$_SERVER = [
'HTTPS' => 'on',
'HTTP_HOST' => 'shop.example.test',
'REQUEST_URI' => '/products.php?category=books&page=2',
];
$isHttps = isset($_SERVER['HTTPS'])
&& $_SERVER['HTTPS'] !== ''
&& strtolower((string) $_SERVER['HTTPS']) !== 'off';
$scheme = $isHttps ? 'https' : 'http';
$host = $_SERVER['HTTP_HOST'];
$requestUri = $_SERVER['REQUEST_URI'];
$currentUrl = $scheme . '://' . $host . $requestUri;
echo $currentUrl, PHP_EOL;
La cadena resultante se construye a partir del esquema, el host y el URI de la solicitud. En tu aplicación, utiliza los valores reales proporcionados por la solicitud y comprueba cómo los rellenan tu servidor web y cualquier proxy de confianza. Valida el host antes de utilizar el resultado en una redirección: construir la URL actual no convierte un destino de redirección arbitrario en uno seguro.