- Actualizar fechaActualizacion en manual-index.ts (100+ capítulos) - Actualizar fechas en archivos .md del manual (public/manual/) - Actualizar fechas en documentación (docs/) - Actualizar fechas en páginas legales (Privacidad, Descargo, AvisoLegal) - Actualizar fechas en scripts de limpieza - Reemplazar todas las referencias de 2024-12-XX a 2025-12-23 - Reemplazar '19 de diciembre de 2024' a '23 de diciembre de 2025'
6 KiB
🔧 Configuración de SPA Routing (Single Page Application)
Fecha: 2025-12-23
📋 Problema
En una SPA (Single Page Application) con React Router, cuando un usuario:
- Accede directamente a una ruta (ej:
/favoritos) - Refresca la página en una ruta específica
- Comparte un enlace a una ruta específica
El servidor intenta buscar un archivo físico en esa ruta. Al no encontrarlo, devuelve un error 404 en lugar de servir el index.html que contiene la aplicación React.
Solución: Configurar el servidor para que todas las rutas que no correspondan a archivos estáticos redirijan a index.html, permitiendo que React Router maneje el enrutamiento del lado del cliente.
✅ Verificaciones Previas
1. React Router Configurado Correctamente
✅ BrowserRouter (no HashRouter) - Verificado en src/App.tsx:
import { BrowserRouter, Routes, Route } from "react-router-dom";
// ...
<BrowserRouter>
<Routes>
{/* rutas */}
</Routes>
</BrowserRouter>
2. Base Path Correcto
✅ Vite config - Verificado en vite.config.ts:
base: base, // '/' por defecto, o '/repository-name/' para GitHub Pages
🔧 Configuraciones por Servidor
1. Vite Dev Server (Desarrollo)
Archivo: vite.config.ts
✅ Ya configurado - Vite maneja automáticamente el SPA routing en desarrollo.
Nota: El servidor de desarrollo de Vite (npm run dev) ya maneja correctamente las rutas SPA.
2. Vite Preview (Previsualización Local)
Archivo: vite.config.ts
✅ Configurado - El servidor de preview también maneja rutas correctamente.
Comando:
npm run preview
3. Nginx (Producción - Servidor Propio)
Archivo: nginx.conf.example
✅ Configurado con:
location / {
try_files $uri $uri/ /index.html;
}
Instrucciones:
- Copiar
nginx.conf.examplea/etc/nginx/sites-available/emerges-tes - Crear symlink:
sudo ln -s /etc/nginx/sites-available/emerges-tes /etc/nginx/sites-enabled/ - Probar:
sudo nginx -t - Reiniciar:
sudo systemctl reload nginx
4. Apache (Producción - Servidor Propio)
Archivo: public/.htaccess
✅ Creado con reglas de mod_rewrite:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ index.html [L]
Instrucciones:
- Asegurar que
mod_rewriteesté habilitado:sudo a2enmod rewrite - El archivo
.htaccessse copia automáticamente adist/concopyPublicDir: true - Reiniciar Apache:
sudo systemctl restart apache2
5. Netlify
Archivo: public/_redirects
✅ Creado con:
/* /index.html 200
Instrucciones:
- El archivo
_redirectsse copia automáticamente adist/concopyPublicDir: true - Desplegar normalmente en Netlify
- Netlify detectará automáticamente el archivo
_redirects
6. Vercel
Archivo: vercel.json
✅ Creado con rewrites:
{
"rewrites": [
{
"source": "/(.*)",
"destination": "/index.html"
}
]
}
Instrucciones:
- El archivo
vercel.jsondebe estar en la raíz del proyecto - Desplegar normalmente en Vercel
- Vercel detectará automáticamente el archivo
vercel.json
7. GitHub Pages
Nota: GitHub Pages requiere configuración especial debido al base path.
Archivo: vite.config.ts
✅ Ya configurado con detección de GitHub Pages:
const isGitHubPages = process.env.GITHUB_PAGES === 'true';
const repositoryName = process.env.GITHUB_REPOSITORY_NAME || 'guia-tes-digital';
const base = isGitHubPages ? `/${repositoryName}/` : '/';
Build para GitHub Pages:
npm run build:github
Nota: GitHub Pages puede requerir un archivo 404.html que redirija a index.html. Esto se puede añadir si es necesario.
8. Otros Servidores
Serve (Node.js)
Si usas npx serve:
npx serve -s dist -l 3000
El flag -s (single) ya maneja SPA routing automáticamente.
Caddy
try_files {path} /index.html
Cloudflare Pages
Configurar en el dashboard:
- Build output:
dist - SPA routing: Habilitado (automático)
🧪 Verificación
Test Local (Vite Preview)
npm run build
npm run preview
# Abrir http://localhost:4173/favoritos
# Debe cargar correctamente
Test Nginx
# Después de configurar Nginx
curl -I http://localhost/favoritos
# Debe devolver 200 OK, no 404
Test Netlify/Vercel
- Desplegar
- Acceder directamente a una ruta (ej:
https://tu-app.netlify.app/favoritos) - Debe cargar correctamente, no mostrar 404
📝 Archivos Creados/Modificados
Archivos Nuevos
- ✅
public/_redirects- Para Netlify - ✅
public/.htaccess- Para Apache - ✅
vercel.json- Para Vercel (actualizado) - ✅
SPA_ROUTING_CONFIG.md- Esta documentación
Archivos Modificados
- ✅
vite.config.ts- Añadida configuración de preview - ✅
nginx.conf.example- Ya tenía la configuración correcta
⚠️ Notas Importantes
-
Archivos Estáticos: Las reglas de redirección deben excluir archivos estáticos (JS, CSS, imágenes, etc.) para que se sirvan correctamente.
-
Cache:
index.htmlNO debe cachearse para permitir actualizaciones. Los assets estáticos SÍ deben cachearse. -
Base Path: Si la app está en un subdirectorio (ej: GitHub Pages), asegurar que el
baseenvite.config.tscoincida. -
Service Worker: El Service Worker también debe manejar rutas correctamente (ya configurado en
public/sw.js).
✅ Estado
Configuración: ✅ COMPLETA
- ✅ Vite dev server - Funciona automáticamente
- ✅ Vite preview - Configurado
- ✅ Nginx - Configurado
- ✅ Apache - Configurado (.htaccess)
- ✅ Netlify - Configurado (_redirects)
- ✅ Vercel - Configurado (vercel.json)
- ✅ GitHub Pages - Base path configurado
Todas las rutas ahora funcionan correctamente al acceder directamente o refrescar.
Última actualización: 2025-12-23