¿Qué son las URL amigables?
Son URL´s que posee un formato más claro, no sólo para el usuario, sino que también para los buscadores. Las páginas con URL´s amigables
tienen, covenientemente, un mejor posicionamiento en los buscadores (no es el objetivo de este artículo explicar porqué) y es por eso que
están de auje hoy en día.
Por ejemplo, una URL estandar es:
www.misitio.com/index.php?libros=computadoras
y su versión amigable sería:
www.misitio.com/libros/computadoras.html
¿Como las implemento esto para obetener el beneficio del posicionamiento?
Primero deberíamos reemplazar los enlaces de nuestra web por su equivalente amigable. Esto hace que los bots de los buscadores reconozcan
URL´s amigables en vez de las estádar proveidas por HTTP. Luego deberíamos anexar cierta lógica a nuestra aplicación web, en este caso
Joomla, para que cuado estos elaces sea invocados se traduzcan a los estádar y nuestro servidor pueda entenderlos.
¿Qué es sh404SEF?
Es un componente de Joomla que reescribe las URL´s de un formato amigable hacia el formato estándar y viceversa.
Anteriormente se dijo que se debería reemplazar los enlaces de todo nuestro sitio a su versión amigable. Pero para esto no existe un
estándar, es por eso que depedemos de la lógica adicional que se le agregue a nuestra aplicación web para poder realizarlo. En este caso esa
lógica es el componente sh404SEF, y de él podemos deducir sus reglas y hacer estas sustitucioes sin mayores problemas. Sus reglas más comunes
son:
"/index.php" se reemplaza por "component/" (sólo si estamos dirigiedonos a algún componente)
"&" se reemplaza por "/"
"=" se reemplaza por ","
¿Cómo trabaja sh404SEF?
La funcionalidad de este componente se realiza sobre Joomla, esto implica que el servidor subyacente es independiente del tratamiento de las
URL´s amigables. De hecho si el servidor recibe una de estas URL´s por defecto la deshecha por tener un formato desconocido. Lo que hace
sh404SEF es modificar el index.php de Joomla para que antes de que el servidor procese la URL ésta pueda ser tranformada en el formato
estandar y así no rechazarla. Más precisament se agrega lo siguiente, aproximadamente al comienzo, al index.php :
if (file_exists( $mosConfig_absolute_path .'/components/com_sef/sef.php' )) {
require_once( $mosConfig_absolute_path .'/components/com_sef/sef.php' );
} else {
require_once( $mosConfig_absolute_path .'/includes/sef.php' );
}
Por lo tanto se ejecutará, entonces, el código residente en sef.php antes de que se prsiga con la ejecución normal de l código de index.php y
las cosas suceden con normalidad.
¿Cuál es el problema de sh404SEF?
Como es de entederse, las URL´s en los formatos mencionados está asociadas directamente. O sea, dada una URL en formato amigable puede
traducirse al formato estándar y viceversa. El problema con sh404SEF es que cuado hace la tranformación amigable-estándar, si la amigable
tiene corchetes éstos serán leidos como simples caracteres de texto en vez de respetar correctamente su semática. Esto es, los corchetes están
para denotar que existe un arreglo asociativo en la URL, pero sh404SEF los interpreta como parte del nombre de la variable anterior. Por
ejemplo: a[] se entiede como la variable escalar "a[]" en vez de el arreglo asociativo "a".
¿Cómo solucionamos el problema?
La solución es simple de implementar, sólo debemos hacer un pequeño cambio al archivo "sef.php".
Aproximadamente en la línea 307:
foreach($uri_array as $value) {
$temp = explode(',', $value);
if (isset($temp[0]) && $temp[0]!='' && isset($temp[1]) && $temp[1]!='') {
$_GET[$temp[0]] = $temp[1]; //estas liea debe ser cambiada
$_REQUEST[$temp[0]] = $temp[1]; //estas liea debe ser cambiada
...
Debe ser reemplazado por (las primeras tre líneas van igual, son solo para orientar):
foreach($uri_array as $value) {
$temp = explode(',', $value);
if (isset($temp[0]) && $temp[0]!='' && isset($temp[1]) && $temp[1]!='') {
//$_GET[$temp[0]] = $temp[1]; // esta líea puede ser eliminada
//$_REQUEST[$temp[0]] = $temp[1]; // esta líea puede ser eliminada
$clave = $temp[0]; // solo por claridad
$valor = $temp[1]; // solo por claridad
$m = array();
if (preg_match("/^(.*)(%5b%5d|\[\])$/i", $clave, $m)) {
$_GET[$m[1]][] = $valor;
$_REQUEST[$m[1]][] = $valor;
} else {
$_GET[$clave] = $valor;
$_REQUEST[$clave] = $valor;
}
¿Terminamos?
Sí, ya estamos listos para disfrutar de nuestras URL´s amigables con Joomla, con la posibilidad de usar corchetes si queremos :-)