Eliminar el index.php de las direcciones de CodeIgniter

  • Por
Todas las URLs de CodeIgniter tienen un index.php que si lo deseamos podemos eliminar usando un archivo htaccess.
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/

Autor

Miguel Angel Alvarez

Miguel es fundador de DesarrolloWeb.com y la plataforma de formación online EscuelaIT. Comenzó en el mundo del desarrollo web en el año 1997, transformando su hobby en su trabajo.

Compartir

Comentarios

Manuel

06/1/2010
No me elimina el index.php
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

Guillermo

06/1/2010
No puedo eliminar el index.php
A mí tampoco me funcionó esto de eliminar index.php, creo haber seguido bien los pasos. No se que faltará. Alguna ayuda

midesweb

11/1/2010
error 404 o qué es lo que ocurre
Hola!

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

Imanol

26/1/2010
Hola, probad esto....
probad poniendo esto en el .htaccess.

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

Lo único que cambia es la última línea.
A ver si asi os funciona,
Un saludo, muy bueno el artículo!!!

Juancete

14/2/2010
RewriteEngine on para eliminar el index.php en CodeIgniter
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.

EdJa

12/3/2010
404
no habia probado esto

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


Edgardo

Distriker

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

Saludos

midesweb

19/3/2010
htaccess mío
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]

Juan

18/5/2010
Problemas
He seguido sus pasos tal cual... me funciono perfectamente en el servidor Local (estoy usando XAMPP)... pero cuandolo lo subo al FTP ya no me funciona.... no se que deba hacer... alguien me pude ayudar?

Sunno

28/6/2010
Modificación al htaccess
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.

alavaros

19/4/2011
No me funciona
Estoy en Ubunut 10.10, tengo CodeIgniter en la carpeta /var/www/codeigniter, he puesto el .htaccess aquí, con "RewriteEngine on
RewriteCond $1 !^(index.php|css|js|images)
RewriteRule ^(.*)$ /index.php/$1 [L]", junto a index.php, he renombrado config.php con $config['index_page'] = ''; , he activado el modo rewrite de apache, sudo a2enmod rewrite, y he reiniciado apache...y aún así no me funciona, ahora mismo accedo a http://localhost/codeigniter y me da error, en chromium "Oops! This link appears to be broken."

¿Alguna idea?

Saludos

alavaros

19/4/2011
Ya me funcionó
Como dicen por aquí, el problema estaba en la barra de antes de index.php en el .htaccess, aunque en el tutorial y en el manual oficial de codeigniter la pongan, solo me funciona si la quito.

Gracias.

Saluidos.

inkalawa

12/6/2011
Eliminar el index.php de las direcciones de CodeIgniter
1. Directorio de Trabajo: /www/hispania
2. Mover allí el Archivo: '.htaccess' junto al archivo index.php de la aplicacion: 'hispania'
3. Editar el Archivo: 'config.php' que se encuentra en: '/hispania/application/config' y dejar la linea así: $config['index_page'] = '';
4. Editar el Archivo: 'httpd.conf' que se encuentra en el directorio de instalacion del Servidor Apache, allí quitar el comentario a la linea:
'#LoadModule rewrite_module modules/mod_rewrite.so' guardar y reiniciar el Servidor Apache
5. Editar el Archivo: '.htaccess' con el siguiente contenido:
RewriteEngine on
RewriteCond $1 !^(index.php|css|js|images|robots.txt)
RewriteRule ^(.*)$ /hispania/index.php/$1 [L]
6. Probar y Listo (así me funcionó)

MRA

06/8/2011
Error en el mod rewrite
Si se quiere seguir utilizando la guia que trae incluida en la instalacion hay que agregarle "|user_guide" dentro del parentesis de la segunda linea

luis_martn-477528

12/11/2011
Posible error para algunos
Como ya han comentado, el código del tutorial no es del todo fiable.
Si la aplicación se encuentra en una subcarpeta de la web (por ejemplo los que tengan varias webs de prueba en XAMPP o similares), lo mejor es cambiar el código por:

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

quitando la barra de delante de index.php en la segunda línea, porque con la barra estás dirigiendo a un posible index.php que haya en el raíz de la web. Sin la barra la ruta es relativa al directorio actual, en el que está el index.php de la aplicación CI y el .htaccess

Jean Carlos Mendoza

09/3/2012
Falto algo
si utilizas linux debes habilitar el modulo redirigido de apache de esta manera

sudo a2enmod rewrite && sudo apache2 restart

y si utilizas windows es otro procedimiento averiguen

mikezero

19/7/2012
Error ?No input file specified.?
Si les aparece este error al momento de modificar su archivo .htaccess prueben cambiando por esto:<br />
<br />
DirectoryIndex index.php<br />
<br />
RewriteEngine on<br />
RewriteBase /<br />
RewriteCond %{REQUEST_FILENAME} !-f<br />
RewriteCond %{REQUEST_FILENAME} !-d<br />
RewriteCond $1 !^(index.php|robots.txt)<br />
<br />
RewriteRule ^(.*)$ index.php?/$1 [L]<br />
<br />
Nota.- Comprueben que tengan PHP5.x si tienen la ultima versión de CI<br />
Saludos!!!

zetman123

17/8/2013
Eliminar el index.php de las direcciones de CodeIgniter
http://www.youtube.com/watch?v=o28alAmcJZ0&feature=youtu.be

ibilis

05/3/2014
situacion con el htaccess
bueno el caso es que a mi tambien me daba al principio el error 500.
estoy usando wamp; mi htaccess quedo al final asi.
RewriteEngine on
RewriteCond $1 !^(index.php|css|js|images|robots.txt)
RewriteRule ^(.*)$ /proyecto/index.php/$1 [L]
yo tengo instalado codeigniter en una subcarpeta llamada proyecto como ven uso la "/" barra al principio ya que sin ella no me funciona.
modifique tal cual indica los pasos los archivos de "config.php".

el truco, despues de la segunda vez que lo intente, fue modificar tambien, como ya lo han mencionado varios, el archivo "HTTPD.conf" de apache, y reiniciar los servicios, una vez hecho esto funciono a la perfección el redireccionamiento.

mientras hacia esto, investigue, y parece depender de la version de cogeigniter que esten usando, para al configuracion y re direccionamiento a la pagina index.php...

Rider

31/5/2014
Solucionado
Hola intente de todo pero me salia el 404 lo ultimo que hice fue poner todo en el contenido del de carpeta code ignither en www :
Antes: www/codeigniter/ archivos de code igniter
Despues: www/archivos de code igniter

Me di cuenta el al reiniciar el apache se creaba automaticamente el htaccess en la raiz obviamente tambien asi quedaria el proyecto al subir al hosting, y el htaccess que teniamos dentro de nuestor proyecto estaba de mas.

Agrege:

DENY FROM ALL
ALLOW FROM 127.0.0.1

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

y corrio espero les ayude.

alberto carlo

15/9/2014
eliminar index de codeigniter
DENY FROM ALL
ALLOW FROM 127.0.0.1

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


este me funciono perfecto ,,gracias y la verdad que me estaba dando dolor de cabeza por tantas vueltas que tuve que dar para lograrlo,(igual soy un simple principiante
)

djmc0282

18/8/2016
Yo lo hice así en wamp
C:wampinapacheapache2.4.9conf
LoadModule rewrite_module modules/mod_rewrite.so (le quite el #)

el .htaccess lo dejé junto al index.php principal con la siguiente configuración
<IfModule mod_rewrite.c>
# Turn on the rewrite engine
RewriteEngine On

# Installation dir
RewriteBase /CodeIgniter_plantilla

# Allow any files or directories that exist to be displayed directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

# Rewrite all other URLs to index.php/URL
RewriteRule .* index.php/$0 [PT]

</IfModule>