Urls amigables sin extensión y front controller
13 Junio, 2006 por CarlosMuy resumido, y seguramente mal explicado, un front controler aplicado a la web consiste en usar una página (en mi caso index.php) para gestionar todas las peticiones y mostrar el resultado en base a ellas.
Por ejemplo, yo lo he usado para mostrar las diferentes secciones de la página web de neurotic. Al index.php le paso como parámetro la sección (index.php?seccion=programacion-web) y este se encarga de mostrarla. En mi caso he usado smarty para gestionar las plantillas pero ahora usaré simplemente un include de php para no complicar más las cosas.
A continuación pongo un ejemplo de código:
// Cargamos el archivo que nos pasan via $_GET
switch($_GET[”seccion”])
{
case “home”: $seccion = “home”;break;case “neurotic”: $seccion = “neurotic”;break;
case “diseno-web”: $seccion = “disenyo”; break;
case “programacion-web”: $seccion = “programacion”; break;
case “equipo-de-neurotic”: $seccion = “equipo”; break;
case “trabajos-diseno-web”: $seccion = “trabajos”; break;
case “proyectos-web-propios”: $seccion = “propios”; break;
default: $seccion = “home”;
}include(”templates/$seccion/index.tpl”);
Puede parecer algo redundante el switch y se podría pensar que sería más fácil hacer un include del parámetro que nos pasan pero una regla de oro es no confiar en los parámetros (para evitar ataques de usuarios malintencionados). Con el switch nos aseguramos que $seccion tendrá sólo unos valores determinados.
Ahora ya tenemos con un sólo fichero php las secciones que queramos pero las url son bastante feas: ni amigables para los usuarios ni para los buscadores. Para lograrlo tan sólo hemos de incluir el siguiente código en nuestro .htaccess:
<ifmodule mod_rewrite.c>
RewriteEngine on
Options +FollowSymlinksRewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?seccion=$1 [L,QSA]
</ifmodule>
Ahora los links en lugar de ser del tipo www.neuroticweb.com/index.php?seccion=neurotic pueden ser simplemente www.neuroticweb.com/neurotic (para que funcione esto index.php debe ser el archivo por defecto primario)
Y eso es todo, ahora sólo faltaría complicarlo un poco más introduciendo varios idiomas.
Junio 14th, 2006 at 7:37 pm
Bastante bueno Carlos, yo por lo general me entiendo poco con el mod_rewrite
Junio 14th, 2006 at 7:40 pm
Gracias :)
Junio 21st, 2006 at 10:54 pm
Url amigables…
Pequeño tutorial sobre como crear páginas con urls amigables y sin extensión con un sólo fichero php y templates html…
Junio 22nd, 2006 at 1:19 am
Muy buen tutorial para principiantes
Junio 22nd, 2006 at 12:55 pm
Gracias Carlos.
Julio 23rd, 2006 at 10:09 pm
Muy buen tutorial.
Sencillo y directo, justamente las cosas que se tienen que realizar.
Un Saludo.
Julio 24th, 2006 at 1:49 pm
Gracias Teland :)
Noviembre 18th, 2006 at 9:58 pm
Hola Carlos… pues acabo de probar de implementar tu idea de “url_amigable” pero no hay manera.. lo he hecho tal y como indicas y nada…
Mi web que tambien usa smarty no consigo hacer que el modo amigable funcione… algo hago mal… alguna idea?
Gracias!
Noviembre 20th, 2006 at 1:38 pm
Hola Xavi, lo mejor es ir probando las cosas una a una y una vez que funciona añadirle lo siguiente.
Comprueba siempre que la variables (con un echo por ejemplo) tienen el valor que esperas.
Noviembre 22nd, 2006 at 2:07 pm
Por ahora la cosa sigue sin salir :( cuando vi tu codigo.. pense.. eso es lo que necesito pero nada :( no hay manera… lo puse siguiendo tus instrucciones y haciendo pruebas varias para adaptarlo a las variables de la web pero nada :( sigo sin ver la salida :(
Si pudieras contactar conmigo por email… o msn te lo agradeceria ;)
Abril 5th, 2007 at 5:34 am
tengo lo siguiente en mi .htaccess
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
lo q necesito es agregarle un RewriteRule q es el siguiente
RewriteRule ^([^/]+)/([^/]+)/([^/]+)\.html$ /pancho/index.php?id=$1&page=$2&ind=$3
como le puedo hacer??????? no me sale de ninguna manera
Abril 10th, 2007 at 4:54 am
Excelente tutorial, anduve investigando toda la tarde y este fué el único que me sirvió, Muchas gracias amigo!!
Abril 10th, 2007 at 12:40 pm
Pues de nada :)
Abril 10th, 2007 at 1:11 pm
Pancho, supongo que necesitas eso además de lo que ya tienes, no?
Prueba a ponerlo justo despues del RewriteBase / y añadele al final una [L]
RewriteEngine On
RewriteBase /
RewriteRule ^([^/]+)/([^/]+)/([^/]+)\.html$ /pancho/index.php?id=$1&page=$2&ind=$3 [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
Diciembre 11th, 2008 at 4:13 am
[…] neuroticweb […]
Mayo 22nd, 2009 at 5:25 am
Hola Carlos: el .htaccess no lo encuentro en mi Public_html. Tengo que crear la carpeta o donde la encuentro. Gracias
Junio 22nd, 2009 at 1:48 am
Genial, funciona perfectamente!
Pero como se haria si necesito pasar mas de una variable por GET??
Gracias
Junio 22nd, 2009 at 2:42 am
Soy una mente inquieta y pro fin me entere, como y por que funciona.
Y ya lo tengo, igual a alguien le vale:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/(.*)/(.*)/(.*)$ index.php?seccion=$1&id1=$2&id2=$3&id3=$4 [L,QSA]
RewriteRule ^(.*)/(.*)/(.*)$ index.php?seccion=$1&id1=$2&id2=$3 [L,QSA]
RewriteRule ^(.*)/(.*)$ index.php?seccion=$1&id1=$2 [L,QSA]
RewriteRule ^(.*)$ index.php?seccion=$1 [L,QSA]