public function onAfterRoute() { $app = Factory::getApplication(); // Solo intervenir en el front-end if ($app->isClient('administrator')) { return; } $input = $app->input; $option = $input->getCmd('option'); $view = $input->getCmd('view'); $uri = Uri::getInstance(); $currentUrl = $uri->toString(); // Variable para evitar redirecciones múltiples en la misma petición static $redirected = false; if ($redirected) { return; } // Intervenir únicamente en com_content y en la vista de artículo if ($option === 'com_content' && $view === 'article') { // Comprobar si la URL sigue el patrón antiguo: /-{id}-{alias} if (preg_match('/\/-(\d+)-(.+)$/', $currentUrl, $matches)) { $id = (int)$matches[1]; // Se podría comparar $matches[2] con el alias actual, si fuera necesario $article = Table::getInstance('Content'); if (!$article->load($id)) { return; } // Truncar alias a 65 caracteres si es preciso $alias = substr($article->alias, 0, 65); // Generar la URL canónica utilizando JRoute $relativeCanonical = JRoute::_("index.php?option=com_content&view=article&id={$article->id}:$alias", false); $canonical = rtrim(Uri::base(), '/') . '/' . ltrim($relativeCanonical, '/'); // Si la URL actual no coincide con la canónica, redirigir permanentemente if ($currentUrl !== $canonical) { $redirected = true; header("Location: $canonical", true, 301); exit; } } else { // Si la URL no coincide con el patrón antiguo, se genera la URL canónica habitual $id = $input->getInt('id'); if ($id) { $article = Table::getInstance('Content'); if (!$article->load($id)) { return; } // Truncar alias a 65 caracteres si es necesario $alias = substr($article->alias, 0, 65); // Generar la URL canónica utilizando JRoute $relativeCanonical = JRoute::_("index.php?option=com_content&view=article&id={$article->id}:$alias", false); $canonical = rtrim(Uri::base(), '/') . '/' . ltrim($relativeCanonical, '/'); // Si la URL actual no coincide exactamente con la canónica, se redirige if ($currentUrl !== $canonical) { $redirected = true; header("Location: $canonical", true, 301); exit; } } } } }