Eliminar el index.php de las direcciones de CodeIgniter

28 de diciembre de 2009
Valoración del artículo:
Todas las URLs de CodeIgniter tienen un index.php que si lo deseamos podemos eliminar usando un archivo htaccess.
Atención: Contenido exclusivo de DesarrolloWeb.com. No reproducir. Copyright.
Lo cierto es que las direcciones de CodeIgniter son bastante amigables a buscadores, pero todavía pueden serlo más. Esto es algo que vamos a ver en este artículo de DesarrolloWeb.com.

En el artículo anterior, sobre las características de las URL de CodeIgniter, ya explicamos varias cosas que conviene saber acerca de componer direcciones para las páginas de nuestras aplicaciones PHP. Como se decía en ese artículo, todas las solicitudes a páginas de una aplicación web en CodeIgniter pasan por un archivo index.php que está en la raíz del framework. Este index.php se encarga de redirigir, o enrutar, la solicitud a través del controlador que se esté invocando (que se indica en el primer segmento después del nombre del dominio).

Así pues, por defecto las URL de CodeIgniter tienen un formato como el que sigue:

http://pruebas.com/index.php/empresas/editar/1

Pues bien, si deseamos eliminar el index.php de esta URL, para simplificar la dirección, hacerla todavía más amigable a buscadores y también más entendible por los seres humanos, podemos utilizar un archivo .htaccess.

Nota: En DesarrolloWeb.com hemos hablado en repetidas ocasiones acerca de los archivos .htaccess, explicando lo que son y cómo podemos utilizarlos para crear automáticamente URLs amigables a buscadores, sin que tengan que existir físicamente los archivos en el servidor. Recomendamos la lectura del manual Editar htaccess para crear direcciones URL amigables http://www.desarrolloweb.com/manuales/htaccess-para-urls-amigables.html para obtener una información de referencia.

Así pues, podríamos conseguir que nuestras direcciones no tuvieran siempre el mencionado index.php y quedasen con una forma similar a esta:

http://pruebas.com/empresas/editar/1

Para ello existirían diversos métodos y según nuestro dominio de los archivos .htaccess y de las expresiones regulares, así como de la configuración de Apache, podremos implementar una u otra. Nosotros en este artículo vamos a explicar un modo que está disponible en la propia guía de uso de CodeIgniter, que hemos probado y resulta sencillo y efectivo.

Se trata de utilizar un método de trabajo con .htaccess que llaman "negativo", donde todas las URLs son redirigidas a través del archivo index.php, a no ser que tengan una forma determinada que no queramos que se redireccione.

Por ejemplo, una URL como esta:

www.loquesea.com/empresas

Se redirigiría a una URL como esta otra:

www.loquesea.com/index.php/empresas

Pero esa redirección se haría de manera transparente al usuario y al navegador que nos visita. Es decir, el procesamiento de la página se hace a través del index.php, pero nosotros no llegamos a percibir que en el servidor se ha llevado a cabo esa redirección, quedando la URL en la barra de direcciones siempre sin el index.php.

Ahora bien, hay determinadas direcciones que no vamos a desear que se redirijan, como puede ser una hoja de estilos CSS. Es decir, podemos tener en nuestro servidor un archivo como este:

www.loquesea.com/css/estilos.css

Y en ningún caso queremos que se procese a través del index.php, sino que directamente se devuelva el archivo CSS que hay en esa ruta. Este es el caso en el que se utiliza el método "negativo" del htaccess, a través del comando "RewriteCond" (condición de redirección). Este caso obvio también lo tendríamos, por ejemplo, en archivos como el robots.txt o aquellos donde podamos tener librerías de código Javascript.

Código htaccess para eliminar el index.php de CodeIgniter

Así pues, podríamos tener un archivo .htaccess en la raíz de la instalación del framework, que suele ser también la raíz del dominio donde estamos trabajando, con un código como el que sigue:

RewriteEngine on
RewriteCond $1 !^(index.php|css|js|images|robots.txt)
RewriteRule ^(.*)$ /index.php/$1 [L]

Esto diría que se redirijan todos los archivos que se soliciten a este dominio, menos los que contengan el propio index.php, css, js, images o robots.txt.

La redirección se hará a través de la misma URL, pero agregando "index.php/" después del nombre del dominio y antes de lo que haya justo después de ese nombre de dominio.

Nota: si tuviéramos CodeIgniter instalado en un subdirectorio de nuestro dominio, por ejemplo, en el subdirectorio "carpeta", la regla de redirección "RewriteRule" cambiaría un poco:

RewriteRule ^(.*)$ /carpeta/index.php/$1 [L]

Ahora, sólo nos faltaría decirle a CodeIgniter que, al componer URLs para los enlaces entre las distintas páginas de nuestra aplicación web PHP, no coloque el index.php, pues no lo necesitamos. Esto lo podemos hacer desde el archivo de configuración principal, que están en: system/application/config/config.php

Simplemente tendríamos que editar la variable de configuración "index_page", poniéndola a la cadena vacía.

$config['index_page'] = "";

Este no sería necesariamente el único método. Por ejemplo, en la Wiki oficial de Codeigniter explican un modo distinto de conseguirlo, aunque bastante más complejo: http://codeigniter.com/wiki/mod_rewrite/

Comentarios
Fueron enviados 10 comentarios al artículo
2 comentarios no revisados
8 comentarios revisados:
No me elimina el index.php
Por: Manuel
06/1/10
antes que nada muchas gracias por el manual se ve muy potente codeigniter estoy intentando aprender a trabajar con el, el primer problema que se me ha presentado es no me elimina el index.php, edite el archivo .htaccess con los mismos parametros, y segui todos los pasos pero no se que estoy haciendo mal. en otra pagina lei que tenia que habilitar el rewrite_module a traves del archivo de conf de apache (http.conf) pero nada no se que estoy haciendo mal. Gracias de antemano
No puedo eliminar el index.php
Por: Guillermo
06/1/10
A mí tampoco me funcionó esto de eliminar index.php, creo haber seguido bien los pasos. No se que faltará. Alguna ayuda
error 404 o qué es lo que ocurre
11/1/10
Hola!

¿Y qué es lo que os ocurre?
¿Accediendo a las URL sin el index.php da un error 404?

Juancet...
RewriteEngine on para eliminar el index.php en CodeIgniter
14/2/10
A mi siempre me daba un error 500 Internal Server Error. Luego me di cuenta de que tenía desactivado el modulo mod_rewrite.so en el archivo de configuración de Apache httpd.conf. Luego de activarlo y reiniciar Apache tuve que hacer algunos cambios en el .htacces. Me quedó así:

RewriteEngine on
RewriteCond $1 !^(index.php|css|js|images|robots.txt)
RewriteRule ^(.*)$ index.php/$1 [L]

Ahora todo funciona bien, al menos de momento. Saludos.
404
12/3/10
no habia probado esto

a mi me da acediendo a las URL sin el index.php da un error 404


Edgardo
Veremos...
19/3/10
Veremos a ver cuando tenga la aplicación ya creada si funciona el .htaccess que le he puesto.

Saludos
htaccess mío
19/3/10
yo tengo ese htaccess funcionando, aunque con una modificación, pues tengo codeigniter instalado en un subdirectorio de mi localhost y no en el raíz del directorio de publicación.

mi instalación de PHP está realizada por medio del paquete xammp.

Tengo codeiginter instalado sobre el directorio
C:xampphtdocscodeigniter

Uso este htaccess:

RewriteEngine on
RewriteCond $1 !^(index.php|css|js|images|robots.txt)
RewriteRule ^(.*)$ /codeigniter/index.php/$1 [L]

Sunno
Modificación al htaccess
28/6/10
Creo que colocar la última línea como
RewriteRule ^(.*)$ index.php/$1 [L]

en vez de
RewriteRule ^(.*)$ /index.php/$1 [L]
(lo que cambia es la barra antes de index.php)

Lo hace más genérico, de esa forma puedes mover la aplicación de carpeta sin tener que tocar el htaccess puesto que usa es el index de la misma carpeta, la dirección es relativa y no absoluta como sugieren en codeigniter.

Ahora bien, tengo una duda, esto daría algún problema de seguridad o algo? es que me sorprenden que lo manejen de esa manera y no como un index relativo, no se si me doy a entender.

Saludos.

Manuales relacionados
Categorias relacionadas
El autor
Últimas noticias
Alojados en el grupo