El "Subdomain Routing" (enrutamiento por subdominio) en Laravel es una característica que te permite definir rutas en tu aplicación que dependen de la parte del subdominio de la URL, en lugar de solo la ruta después del dominio principal.
En lugar de tener todas tus rutas bajo el mismo dominio principal (ej. midominio.com/dashboard, midominio.com/admin), puedes hacer que diferentes secciones o incluso diferentes clientes de tu aplicación respondan a subdominios específicos (ej. panel.midominio.com, admin.midominio.com, cliente1.midominio.com).
¿Cómo funciona?
Laravel utiliza el método domain() en sus definiciones de rutas para lograr esto. Este método te permite especificar un patrón de dominio, incluyendo comodines para capturar subdominios dinámicos.
Conceptos Clave:
Dominio Estático: Puedes definir una ruta para un subdominio fijo:
admin.midominio.com
api.midominio.com
Dominio Dinámico (con Comodín): Puedes capturar una parte del subdominio como un parámetro de ruta, usando llaves {}. Esto es muy potente para aplicaciones multi-inquilino (multi-tenant):
{cuenta}.midominio.com (donde {cuenta} podría ser el nombre de una empresa o usuario)
Casos de Uso Comunes para el Subdomain Routing:
Aplicaciones Multi-inquilino (Multi-tenant): Este es el caso de uso más frecuente. Cada cliente o "inquilino" de tu software como servicio (SaaS) tiene su propio subdominio (ej., empresaA.miaplicacion.com, empresaB.miaplicacion.com). Laravel puede entonces usar el subdominio para cargar la configuración correcta de la base de datos, el tema visual o los datos específicos de ese cliente.
Separación de Secciones de la Aplicación: Si tienes una aplicación grande con una sección de administración, una API y una interfaz de usuario pública, podrías separarlas lógicamente:
www.midominio.com (interfaz pública)
admin.midominio.com (panel de administración)
api.midominio.com (endpoints de la API)
Branding o Personalización: Ofrecer subdominios personalizados a los usuarios (ej., nombreusuario.tuservicio.com).
Implementación en Laravel:
Para usar el enrutamiento por subdominio, necesitas dos cosas principales:
1. Configuración de DNS (Fuera de Laravel):
Este es el paso más importante y a menudo el que se olvida. Necesitas configurar tus registros DNS para que los subdominios apunten a tu servidor Laravel.
Comodín DNS (*.midominio.com): Para subdominios dinámicos (como en aplicaciones multi-inquilino), necesitas un registro DNS de tipo A o CNAME que apunte a la IP de tu servidor y que use un comodín. Por ejemplo, *.midominio.com apuntando a TU_IP_DEL_SERVIDOR. Esto le dice al servidor DNS que cualquier subdominio bajo midominio.com debe dirigirse a tu servidor.
Subdominios Estáticos: Si solo usas subdominios fijos (como admin.midominio.com), puedes crear un registro A específico para cada uno.
2. Definición de Rutas en Laravel:
En tu archivo de rutas (generalmente routes/web.php o routes/api.php), usarás el método domain() dentro de un grupo de rutas:
PHP
use Illuminate\Support\Facades\Route;
// Rutas para el dominio principal (www.midominio.com o midominio.com)
// Estas rutas NO se verán afectadas por el enrutamiento de subdominios
Route::get('/', function () {
return 'Bienvenido a la página principal.';
});
Route::get('/contacto', function () {
return 'Página de contacto.';
});
// --- ENRUTAMIENTO POR SUBDOMINIO ---
// Ejemplo 1: Subdominio estático (admin.midominio.com)
Route::domain('admin.midominio.com')->group(function () {
Route::get('/', function () {
return 'Panel de administración.';
});
Route::get('/usuarios', function () {
return 'Lista de usuarios del panel de administración.';
});
// Puedes aplicar middleware aquí también, por ejemplo, para autenticación de admin
// Route::middleware('auth:admin')->group(function () { ... });
});
// Ejemplo 2: Subdominio dinámico (aplicación multi-inquilino)
// Por ejemplo, cliente1.midominio.com, cliente2.midominio.com
Route::domain('{cuenta}.midominio.com')->group(function () {
Route::get('/', function ($cuenta) {
return 'Bienvenido a la página de inicio de la cuenta: ' . $cuenta;
});
Route::get('/perfil', function ($cuenta) {
return 'Perfil de la cuenta: ' . $cuenta;
});
Route::get('/facturas/{id}', function ($cuenta, $id) {
return "Factura {$id} para la cuenta: {$cuenta}";
});
});
// CONSIDERACIÓN IMPORTANTE PARA DESARROLLO LOCAL:
// Para probar esto en desarrollo local, necesitas modificar tu archivo `hosts`
// (en Windows: C:\Windows\System32\drivers\etc\hosts, en macOS/Linux: /etc/hosts)
// y añadir entradas como:
// 127.0.0.1 midominio.com
// 127.0.0.1 admin.midominio.com
// 127.0.0.1 cliente1.midominio.com
// 127.0.0.1 cliente2.midominio.com
// (Asegúrate de que tu servidor local, como Laravel Valet o Apache/Nginx, esté configurado para manejar estos dominios virtuales)
Cómo acceder al parámetro del subdominio:
Como puedes ver en el Ejemplo 2, la parte del subdominio capturada por el comodín ({cuenta}) se pasa automáticamente como un parámetro a la función de cierre de la ruta o al método del controlador, al igual que los parámetros de ruta normales.
PHP
// En un controlador
namespace App\Http\Controllers;
use App\Models\Cuenta; // Suponiendo que tienes un modelo Cuenta
class CuentaController extends Controller
{
public function mostrarDashboard(string $cuenta)
{
// $cuenta contendrá el valor del subdominio, ej. "cliente1"
$infoCuenta = Cuenta::where('slug', $cuenta)->firstOrFail();
return view('dashboard', compact('infoCuenta'));
}
}
// Ruta en web.php
Route::domain('{cuenta}.midominio.com')->group(function () {
Route::get('/', [CuentaController::class, 'mostrarDashboard']);
});
Ventajas del Subdomain Routing:
Organización Lógica: Ayuda a estructurar grandes aplicaciones de forma semántica.
Separación Clara de Contextos: Especialmente útil para aplicaciones multi-inquilino, donde cada subdominio representa un contexto de datos o una configuración única.
Flexibilidad: Permite la creación de URLs más limpias y expresivas para ciertas funcionalidades.
Posibles Beneficios de Escalabilidad: En infraestructuras complejas, diferentes subdominios pueden dirigirse a diferentes grupos de servidores o microservicios.
Desventajas/Consideraciones:
Configuración DNS: Requiere una configuración DNS más avanzada (registros de comodín) en comparación con el enrutamiento basado en rutas.
Certificados SSL: Necesitarás un certificado SSL de comodín (Wildcard SSL) para cubrir todos tus subdominios (*.midominio.com), lo cual puede ser más costoso que un certificado para un solo dominio.
Entorno Local: Requiere una configuración adicional en tu archivo hosts y en tu servidor de desarrollo (Valet, Laragon, Apache/Nginx) para simular los subdominios.
Compartir Cookies: Las cookies se establecen a nivel de dominio. Si quieres compartir sesiones o datos de cookies entre subdominios, necesitarás configurar el SESSION_DOMAIN en tu .env de Laravel a .midominio.com (con el punto inicial).
En resumen, el enrutamiento por subdominio en Laravel es una poderosa herramienta para crear arquitecturas de aplicación más organizadas y flexibles, especialmente para escenarios multi-inquilino o cuando deseas una clara separación de las funcionalidades de tu aplicación a nivel de URL.
No hay comentarios:
Publicar un comentario