| |

Laboratorio: modificar urls para CodeIgniter con mod_rewrite

codeigniter.pngCodeIgniter es uno de los frameworks PHP de los que más se habla últimamente, a mí personalmente me gusta bastante, aunque hay algunas cosas que no son como me gustaría.

Una de ellas es la estructura de las URLs, las URLs siguen el formato:

http://dominio/controlador/metodo/parametro/parametro/...

El controlador es la clase que se encarga de hacer las operaciones y el método es el método de la clase que realiza una función concreta.

Por ejemplo si tenemos una tienda online, podemos tener un controlador para productos y un método que sea editar, con el que se podrá modificar las características del producto. La url sería la siguiente:

http://tienda.com/articulo/editar/cafetera

Con esta url podemos editar un artículo llamado cafetera y además es bastante entendible. Pero, ¿qué pasa si queremos mostrar el artículo cafetera?, pues que la url debería ser la siguiente:

http://tienda.com/articulo/ver/cafetera

Pero lo de ver no queda demasiado bien y queda mejor si es directamente:

http://tienda.com/articulo/cafetera

El problema nos lo encontramos cuando queremos usar una URL que no indique el método y si un parámetro. Si no usamos ni método ni parámetro, CodeIgniter toma por defecto el método index, pero si no usamos método y si parámetro, CodeIgniter no es capaz de saber que lo que mandamos es un parámetro, por lo que hay que usar el Apache para que siga la estructura de CodeIgniter.

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^articulo/(.+)$ index.php/articulo/ver/$1 [L]
RewriteCond $1 !^(index\.php|favicon\.ico)
RewriteRule ^(.*)$ index.php/$1 [L]

Hay que tener en cuenta que este ejemplo es válido únicamente si solo se va a usar siempre dos segmentos en la url, uno para el controlador y otro para el parámetro.

La segunda parte y el uso de index.php es debido a que CodeIgniter usa este script para gestionar toda la aplicación, y para que no aparezca, debemos redireccionarlo todo a index.php, menos los ficheros que existen como el favicon, el robot.txt, etc.