Volver a la portada del blog

Urls amigables sin extensión y front controller

13 Junio, 2006 por Carlos

Muy 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 +FollowSymlinks

RewriteCond %{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.

18 respuestas to “Urls amigables sin extensión y front controller”

  1. Caraie Says:

    Bastante bueno Carlos, yo por lo general me entiendo poco con el mod_rewrite

  2. Carlos Says:

    Gracias :)

  3. meneame.net Says:

    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…

  4. Carlos Leopoldo Says:

    Muy buen tutorial para principiantes

  5. Carlos Says:

    Gracias Carlos.

  6. TelandWeb Solutions Says:

    Muy buen tutorial.

    Sencillo y directo, justamente las cosas que se tienen que realizar.

    Un Saludo.

  7. Carlos Says:

    Gracias Teland :)

  8. Xavi Says:

    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!

  9. Carlos Says:

    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.

  10. Xavi Says:

    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 ;)

  11. pancho Says:

    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

  12. Willy Rios Says:

    Excelente tutorial, anduve investigando toda la tarde y este fué el único que me sirvió, Muchas gracias amigo!!

  13. Carlos Says:

    Pues de nada :)

  14. Carlos Says:

    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]

  15. Mediterranean Adobe User Group » Blog Archive » Instalando MySQL4+PHP4+Apache2 Says:

    […] neuroticweb […]

  16. Fernando Z Says:

    Hola Carlos: el .htaccess no lo encuentro en mi Public_html. Tengo que crear la carpeta o donde la encuentro. Gracias

  17. Elmasmenos Says:

    Genial, funciona perfectamente!

    Pero como se haria si necesito pasar mas de una variable por GET??

    Gracias

  18. Elmasmenos Says:

    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]

Deja un comentario