[Introducción a PHP] ¡Cambia de Página con Total Libertad! Entendiendo el Mecanismo Creando un Router Sencillo
Con lo que hemos aprendido hasta ahora, ya somos capaces de obtener información de una base de datos usando PHP y generar páginas dinámicas. Sin embargo, lo normal es que un sitio web tenga múltiples páginas diferentes, como "Página de inicio", "Quiénes somos", "Contacto", etc. ¿Cómo podemos gestionar eficientemente estas páginas compartiendo elementos comunes como cabeceras y pies de página?
La respuesta está en un concepto llamado "enrutamiento" (routing). El enrutamiento es un mecanismo que actúa como "control de tráfico", cambiando el contenido a mostrar según la URL a la que el usuario ha accedido. En este artículo, crearemos un router muy simple en PHP usando parámetros de URL como `index.php?page=about`. Al tocar la parte central de lo que hacen los frameworks completos como Laravel por detrás, profundizaremos nuestra comprensión de la estructura de las aplicaciones web y daremos un gran paso hacia nuestro próximo aprendizaje.
Para preparar tu entorno para ejecutar PHP (entorno de desarrollo), si aún no has configurado XAMPP, por favor consulta ¡[Introducción a PHP] Guía completa para descargar e instalar XAMPP!. ¡Después de la instalación, simplemente coloca tu archivo PHP en la carpeta especificada (como `htdocs`) y estarás listo!
1. ¿Qué es el mecanismo de enrutamiento? Control de tráfico con PHP
El mecanismo de enrutamiento se puede comparar con un recepcionista en un gran edificio. Todos los visitantes (usuarios) llegan primero a la misma entrada principal (index.php). Luego, le dicen al recepcionista (router) "Quiero ir al departamento XX (?page=about)". Entonces, el recepcionista los guía al departamento apropiado (about.php) según su destino.
Para crear este mecanismo, utilizaremos los siguientes tres elementos de PHP.
- Variable
$_GET: Una variable especial de PHP para recibir el valor de `page` (en este caso, `about`) de una "cadena de consulta" como?page=aboutañadida al final de la URL. - Sentencia
include: Una orden para leer y combinar el contenido de otro archivo PHP en la ubicación especificada. Esto te permite compartir elementos comunes como cabeceras y pies de página. - Función
file_exists(): Una función de seguridad muy importante que comprueba si el archivo que intentas cargar realmente existe en el servidor, en caso de que se especifique una URL maliciosa.
Combinando estas partes, se completa un router que cambia el contenido de la pantalla según la URL.
2. ¡A la práctica! Creando un Router Sencillo con 3 Archivos
Ahora, vamos a crear un router sencillo. Esta vez, prepararemos los siguientes tres archivos y los guardaremos todos en la misma carpeta.
- index.php: El diseño que sirve como esqueleto para todas las páginas y el propio router que gestiona el control de tráfico.
- home.php: La parte del contenido que se mostrará como la página de inicio.
- about.php: La parte del contenido que se mostrará como la página "Acerca de este sitio".
Archivo 1: index.php (Router y Diseño)
Este archivo es la "entrada principal" de nuestro sitio. Tiene partes comunes como la navegación y un área de visualización de contenido que cambia según la URL. Este será nuestro "ejemplo de HTML completo y funcional".
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<title>Sitio con Router Sencillo</title>
<style>
body { font-family: sans-serif; line-height: 1.8; }
.container { max-width: 800px; margin: 20px auto; padding: 20px; border: 1px solid #ddd; }
nav { background: #f0f0f0; padding: 10px; margin-bottom: 20px; }
nav a { margin-right: 15px; text-decoration: none; color: #0056b3; }
nav a:hover { text-decoration: underline; }
.content { border-top: 2px solid #eee; padding-top: 20px; }
footer { margin-top: 30px; text-align: center; font-size: 0.9em; color: #777; }
.not-found { color: red; font-weight: bold; }
</style>
</head>
<body>
<div class="container">
<header>
<h1>Sitio de Ejemplo con Router Sencillo</h1>
</header>
<nav>
<a href="index.php?page=home">Inicio</a>
<a href="index.php?page=about">Acerca de este sitio</a>
</nav>
<div class="content">
<?php
// 1. Obtener el nombre de la página a mostrar desde el parámetro de la URL
// Si no hay parámetro, 'home' es el predeterminado
$page = $_GET['page'] ?? 'home';
// 2. Lista de páginas permitidas (lista blanca)
$allowed_pages = ['home', 'about'];
// 3. Comprobar si el nombre de la página está en la lista de permitidas
if (in_array($page, $allowed_pages)) {
// 4. Crear la ruta del archivo correspondiente
$file_path = $page . '.php';
// 5. Comprobación final de si el archivo existe antes de incluirlo
if (file_exists($file_path)) {
include($file_path);
} else {
echo '<p class="not-found">Error: No se encuentra el archivo.</p>';
}
} else {
// Si se especifica una página no permitida
echo '<p class="not-found">404 Not Found: La página especificada no existe.</p>';
}
?>
</div>
<footer>
<p>© 2025 Simple Router Inc.</p>
</footer>
</div>
</body>
</html>
Archivo 2: home.php (Contenido de Inicio)
Este es un archivo que solo contiene el contenido para la página de inicio (top page), que será incluido en `index.php`.
<h2>¡Bienvenido!</h2>
<p>Esta es la página de inicio.</p>
<p>Cuando haces clic en la navegación de arriba, el valor de ?page= en la URL cambia, y el contenido mostrado cambia.</p>
Archivo 3: about.php (Contenido sobre el sitio)
De manera similar, este es el contenido que se carga cuando se especifica `index.php?page=about`.
<h2>Acerca de este sitio</h2>
<p>Este sitio es un ejemplo para aprender el mecanismo de un enrutador sencillo en PHP.</p>
<p>index.php sirve como base, y carga dinámicamente el contenido de diferentes archivos como este about.php según el parámetro de la URL.</p>
¡Ahora está todo listo! Intenta acceder a `index.php` en tu navegador. Deberías poder confirmar que cada vez que haces clic en un enlace de navegación, solo el contenido central cambia entre "Inicio" y "Acerca de este sitio".
3. Un punto a tener en cuenta: Ataque de Directory Traversal
Al crear un router sencillo por tu cuenta, una cosa que absolutamente debes saber es el ataque de **Directory Traversal**. Si escribes código como el siguiente sin medidas de seguridad, es muy peligroso.
<?php
// Mal ejemplo: ¡Nunca lo imites!
$page = $_GET['page'];
include($page . '.php'); // Usando la entrada del usuario tal cual sin validación
?>
Con este código, un atacante podría especificar una cadena especial en la URL como `?page=../../../../etc/passwd`, lo que podría permitirle leer archivos de configuración importantes del servidor que no deberían ser accedidos.
Para prevenir este ataque, nuestro ejemplo de `index.php` incluye una verificación en dos pasos.
- Método de lista blanca (Whitelist): Crear una lista de permisos llamada `$allowed_pages` y comprobar si el nombre de la página especificada está en ella usando `in_array()`.
- Comprobación de existencia del archivo: Incluso si pasa la lista de permisos, como precaución, realizar una comprobación final para ver si el archivo realmente existe con `file_exists()`.
Esta contramedida evita que se carguen archivos no deseados y mejora la seguridad.
4. Resumen y próximos pasos
Esta vez, hemos aprendido el mecanismo de un router sencillo que cambia el contenido a mostrar usando parámetros de URL y la sentencia `include` de PHP. ¿Has captado la sensación de cómo se puede construir un sitio web completo con un único punto de entrada, `index.php`, que gestiona el control del tráfico según la URL?
De hecho, los frameworks modernos de PHP que usamos habitualmente, como Laravel y Symfony, proporcionan una versión más avanzada y segura de este mecanismo de enrutamiento. El conocimiento de este artículo es una base importante para entender por qué dichos frameworks son necesarios y qué está sucediendo detrás de escena.
Como siguiente paso, sería interesante intentar crear "**URLs amigables**" (pretty URLs) reescribiendo las URLs con un archivo `.htaccess`, para hacer que URLs como `index.php?page=about` se vean más bonitas, como `/about`. Esto seguramente profundizará tu comprensión de cómo funciona la web.