Quitar el index.php de la URL en CodeIgniter 3 y configurar el htaccess

- Andrés Cruz

Quitar el index.php de la URL en CodeIgniter 3 y configurar el htaccess

CodeIgniter es un estupendo framework para desarrollar aplicaciones en PHP pequeñas y medianas de manera rápida, organizada y que como todo framework cuenta con numerosas características y funcionalidades que podemos emplear; CodeIgniter ya ofrece por defecto unas URLs muy amigables a los navegadores pero para esto debemos de configurar algunas cosas.

Pero como todo en la vida, necesita configuraciones, que en el caso de CodeIgniter son mínimas pero debes conocer cómo hacerlas que de paso son sencillisimas, configurar la base de datos y poco más; también debemos de configurar un pequeño "inconveniente" que ocurre con el index.php que ensucia las URLs y que por defecto está presente en todas las URLs de nuestra aplicación y no nos ayuda con el SEO, mas bien todo lo contrario:

index.php en una URL

Esto es algo que agrega "ruido" a nuestras URL agregando caracteres o palabras innecesarias para que funcione y que podemos solventarlo fácilmente; este comportamiento se debe a que todas las solicitudes de CodeIgniter pasan por el index.php que está ubicado en la raíz del proyecto y por ende es que se encuentran configurado como mostramos anteriormente.

Colocar el index.php en la URL es un paso necesario que se debe de aplicar cuando se desea acceder a cualquier controlador; en esta segunda entrada sobre CodeIgniter, veremos como quitar el index.php de la URL.

Cómo eliminar el index.php de las direcciones de CodeIgniter

Como comentamos anteriormente, por defecto, al momento de acceder a cualquier controlador de nuestra aplicación hay que incluir el index.php en las URLs, es decir:

  http://ejemplo.com/index.php/articulo/nuevos

  • En donde ejemplo.com es su dominio.
  • index.php es el archivo a eliminar de la URL.
  • articulo es el controlador.
  • nuevos es la acción asociada al controlador.

Y con esta pequeña demostración vemos el problema que tenemos que solucionar para trabajar más cómodamente con CodeIgniter; lo que queremos lograr es que nuestra URL quede de la siguiente forma:

  http://ejemplo.com/articulo/nuevos

Sin el index.php

El archivo htaccess para remover el index.php> de las URL de CodeIgniter

El primer paso que podemos realizar es modificar el archivo .htaccess, que es un archivo que nos sirve para comprimir recursos que provienen de la aplicación, hacer redirecciones y como puedes imaginar este archivo se ejecuta antes de cualquier PHP y es un archivo generalmente sencillo llamado .htaccess que debemos crear en caso de que no exista en la raíz de la instalación del framework con el siguiente contenido:

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

Aquí en la última línea indicamos que realiza una redirección 301 que son las empleadas al momento del SEO para indicar que un recurso se movió a otro lugar de manera absoluta; la línea 1 indicamos la activación del modo de sobrescritura de Apache también conocido como mod_rewrite.

¿Qué conseguimos con el archivo htaccess creado anteriormente?

Redireccionar todas las URLs menos las que contengan el propio index.php, images o robots.txt; para eso debemos habilitar el RewriteEngine en CodeIgniter como vimos anteriormente, este también es conocido como el modo rewrite o mod_rewrite y las emplean TODAS las aplicaciones en PHP lo que incluye CodeIgniter, es una tecnología de Apache como puedes consultar en el enlace anterior que nos permite redireccionar URLs fácilmente.

Tenga en cuenta que si tenemos CodeIgniter instalado en un subdirectorio de nuestro servidor, por ejemplo, en el subdirectorio "carpeta", la regla de redirección "RewriteRule" quedaría así:

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

Una vez hecho esto, deberemos asegurarnos de que el módulo rewrite del servidor Apache esté activado.

Modificando el application\config.php de nuestro proyecto para remover el index.php

El siguiente y último de los pasos que tenemos que hacer es modificar el archivo llamado config.php de la siguiente variable:

$config['index_page'] = 'index.php';

Por:

$config['index_page'] ='';

Como puedes ver, esa configuración le indica a CodeIgniter que al componer las URLs para las distintas páginas webs de nuestra aplicación web en PHP no emplee el index.php en las URLs de nuestra aplicación, porque no es necesario, lo único que hace es ensuciar nuestras URLs.

Con estos dos cambios ya estaríamos listo y el index.php no debería dar más problemas; estas configuraciones funcionan en todas las versiones de CodeIgniter, lo que significa que con esto podemos remover el index.php de CodeIgniter 3 que es la última versión estable del famoso framework.

Extra: Qué más podemos hacer con el htaccess en CodeIgniter

Aunque como debes saber. el archivo htaccess no es un archivo que sea propio de CodeIgniter, si no más bien de Apache, podemos valernos de que estas tecnologías funcionan muy bien juntas, es decir PHP y Apache y por lo tanto CodeIgniter para hacer que nuestras aplicaciones se comporten como queramos:

Forzar el uso de www en nuestra URL desde el htaccess

Otro aspecto fundamental en el SEO es no repetir contenido y aunque no lo parezca:

www.example.com

Es diferente a:

example.com

Y esto es algo que Google nos dice que corrijamos y que tenemos que tener en cuenta, en los htaccess podemos corregir este problema:

RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]

Si nuestro sitio emplea conexión segura, entonces empleamos:

RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}/$1 [R=301,L]

Muy pero muy importante el [R=301,L] que hace que nuestro sitio redireccione mediante el código HTTP 301, que es fundamental en el SEO para indicar que un recurso se movió de manera permanente a otro sitio, es decir, nuestro sitio que antes estaba sin las www ahora es el sitio www.example.com.

Remover el último slash / de nuestra URL con el htaccess

Este slash que se encuentra al final de nuestra URL, seguro es uno de los más difíciles de ver, pero así también estamos indicando contenido repetido; para remover el último / de nuestra URL con el htaccess:

RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ /$1 [L,R] # <- for test, for prod use [L,R=301]

Comprimir archivos por el tipo de archivo con los htaccess

Comprimir datos como CSS y HTML en el servidor es bastante fácil:

# Deflate Compression by FileType
<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/plain
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE text/xml
AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE text/javascript
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE application/xhtml+xml
AddOutputFilterByType DEFLATE application/rss+xml
AddOutputFilterByType DEFLATE application/atom_xml
AddOutputFilterByType DEFLATE application/javascript
AddOutputFilterByType DEFLATE application/x-javascript
AddOutputFilterByType DEFLATE application/x-shockwave-flash
AddOutputFilterByType DEFLATE application/x-font
AddOutputFilterByType DEFLATE application/x-font-truetype
AddOutputFilterByType DEFLATE application/x-font-ttf
AddOutputFilterByType DEFLATE application/x-font-otf
AddOutputFilterByType DEFLATE application/atom+xml application/json image/svg+xml image/x-icon text/x-component
</IfModule>

activar la cache con los htaccess

Siguiendo con los trucos SEO, la velocidad es algo primodcial en nuestro sitio, podemos indicar cual es la fecha de expiración de nuestros recursos con:

Caché de archivos

Para guardar datos en la caché de nuestro servidor podemos hacer:

# turns cache on for 1 month
<IfModule mod_expires.c>
ExpiresActive On
ExpiresByType image/jpg "access 1 year"
ExpiresByType image/jpeg "access 1 year"
ExpiresByType image/gif "access 1 year"
ExpiresByType image/png "access 1 year"
ExpiresByType text/css "access 1 month"
ExpiresByType text/html "access 1 month"
ExpiresByType application/pdf "access 1 month"
#ExpiresByType text/x-javascript "access 1 month"
ExpiresByType application/x-shockwave-flash "access 1 month"
ExpiresByType image/x-icon "access 1 year"
ExpiresDefault "access 1 month"
</IfModule>

Redireccionar de una URL u otro sitio a otro sitio:

Muchas veces queremos pasar nuestra aplicación a otro dominio, para ello:

RewriteCond %{HTTP_HOST} ^desarrollolibre.net$ [NC]
RewriteRule ^(.*)$ http://desarrollolibre.space [R=301,L]

Otros datos con el htaccess y CodeIgniter

Si tu proyecto CodeIgniter no se encuentra en la raíz del servidor, debes de indicar el nombre de la carpeta en el RewriteBase:

RewriteBase /
Andrés Cruz

Desarrollo con Laravel, Django, Flask, CodeIgniter, HTML5, CSS3, MySQL, JavaScript, Vue, Android, iOS, Flutter

Andrés Cruz en Udemy

Acepto recibir anuncios de interes sobre este Blog.