Hacer un redireccionamiento de enlaces antiguos

Recientemente he actualizado una web pasándola de un viejo y lento joomla, a un potente y velocísimo kumbiaphp. En el cambio me he visto inmerso en 3 graves problemas:

  1. Base de datos muy grande y algo lenta.
  2. Muchísimas visitas.
  3. Artículos con escritura de la URL “diferente”

El problema 1 y 2 se soluciono muy fácilmente usando la cache (de la cual hablaré próximamente en un post especifico dedicado a ello), pero lo verdaderamente sorprendente por su sencillez y simplicidad es como reconstruir las URL antiguas para que funcione con el nuevo diseño de url/rutas.

Al principio imaginé que la forma más sencilla de hacerlo sería mediante reglas en el htaccess. Después pensé en modificar el router del core para que funcionase como yo quería, pero al final resultó muchísimo más sencillo: redireccionamiento desde la vista 404.

Si estamos con el sitio en PRODUCCION, cuando una URL de nuestro sitio no existe, kumbia lanzará la vista 404.phtml para informarnos del error. Es allí, mediante unas simples validaciones donde podremos comprobar la URL que falla, analizarla y ver si tenemos que redirigirla a la URL correcta mediante un redireccionamiento 301 (Página movida permanentemente) o si por el contrario es un error 404 legítimo.

Ventajas:

  1. Fácil manejo desde PHP
  2. Independiente del servidor
  3. Más velocidad (sólo necesita validar si no existe la URL y no en cada Request)

Os dejo el código que me sirvió a mi, tanto cuando las urls correspondían con un patrón fijo, como para otras URL estáticas que tienen su correspondiente nueva URL. También podéis crear una clase para manejar vuestras redirecciones.


<?php
   // views/_shared/errors/404.phtml
   $buscar = filter_var(Router::get('route'), FILTER_SANITIZE_STRING);

   $correspondecias = array(
   "/jprovincia.html" => "provincia",
   "/portada.html" => "portada",
   "/jopinion.html" => "jopinion",
   "/region.html" => "region",
   "/local.html" => "local",
   "/jsociedad.html" => "sociedadcultura",
   "/deportes.html" => "deportes"
   );

   if(isset($correpondencias[$buscar])) {
       Redirect::to("secciones/".$correspondecias[$buscar], 0, 301);
       exit();
   }

   $articulo = (new Articulos)->find_first("urlantigua = '$buscar'");
   if($articulo) {
      Redirect::to("articulos/$articulo->slug", 0, 301);
      exit();
   }
// continuar con la vista 404
?>