Codeigniter, parte 2: Eliminar index.php de la url

5 Ago

En la publicación pasada vimos cómo crear acciones. Para probar cómo funcionan las mismas armamos un controlador con el nombre controlador_test.php, el cual tenía dentro suyo tres acciones. También vimos cómo acceder a estas acciones con su respectiva url, la cual contenía el archivo index.php/controlador/accion. El código del controlador era:

<?php
if (!defined('BASEPATH'))
   exit('No direct script access allowed');
class Controlador_test extends CI_Controller { 
   public function index(){
      echo 'Página inicial del controlador';
   } 
   public function accion2(){
      echo 'Página 2';
   } 
   public function accion3(){
      echo 'Página 3';
   } 
}

Y luego accedíamos a las acciones de este controlador de la siguiente forma:

Para index():

http://localhost/ci/index.php/controlador_test/index

Para accion2():

http://localhost/ci/index.php/controlador_test/accion2

Y finalmente para accion3():

http://localhost/ci/index.php/controlador_test/accion3

Sin embargo, habrás notado el no tan agradable index.php en la url ¿Se ve mal no? Sí, yo creo que sí.

Se vería mucho mejor si accediéramos a nuestro proyecto mediante por ejemplo:

http://localhost/ci/controlador_test/index

Para ello haremos el siguiente cambio.

Primero que nada vamos a la raíz de nuestro proyecto (a la altura de index.php), y creamos un archivo con el siguiente nombre:

.htaccess

Tener cuidado, ya que si estás manejando Windows, al no tener un nombre + punto + extensión, nos creará un archivo con extensión .txt, el mismo debe ser tal cual como lo vemos ahí.

Dentro de éste copiaremos el siguiente código:

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

Esto le indicará a nuestro proyecto que sólo se podrá acceder al archivo index.php; a las carpetas css, js e images; Si necesitas otra carpeta de carácter público deberías agregarlo al final de images. Aunque estas carpetas aun no las hemos creado, seguramente serán necesarias más adelante cuando tengamos ese tipo de archivos públicos en nuestro proyecto.

Finalmente en la última línea, es la que se encarga de ignorar el index.php de nuestro proyecto. Aunque hay que recordar que todas las acciones pasarán primero por index.php, y luego será está la encargada, y dependiendo del path de la url, de llamar al controlador y acción correspondiente.

Ahora sí, al ingresar a:

http://localhost/ci/controlador_test/index

Va a ignorar el index.php.

 

Anterior: Codeigniter, parte 1: Introducción y configuración

Siguiente: Codeigniter, parte 3: Página principal y error 404

Redes sociables

    17 thoughts on “Codeigniter, parte 2: Eliminar index.php de la url

    1. Primero gracias por el tiempo, muy bueno el curso tengo una inquietud..

      de casualidad tienen un manual sobre .htaccess ya que realizando los cambios no me funciono me sale un error estoy utilizando “Apache/2.4.10 (Ubuntu) Server ”

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

      • Deberías acceder a tu archivo httpd.conf y buscar la siguiente línea:

        #LoadModule rewrite_module modules/mod_rewrite.so

        Le quitás el # y reiniciás el servidor.

        Saludos!

    2. Hola, muy bueno tu aporte, hice todos los pasos que mencionas…y no me funcionaba… pero al comentar la linea “if ( ! defined(‘BASEPATH’)) exit(‘No direct script access allowed’);” en el controlador, recien me ejecuta… ,mi consulta es… me perjudirara a futuro el comentar esta linea de codigo???

      es la unica manera que he logrado q me salga.

    3. Hola
      Pero si quiero acceder a otro controlador pero cambiando la url, ejemplo:

      Tengo el controlador por defecto control1.php en el archivo de routes.php
      y su url seria localhost/control1 por decir algo.

      pero si yo quiero acceder a otro controlador control2.php
      con esta url localhost/control2 no me deja me dice que no fue encontrada

      pero si le coloco localhost/index.php/control2 si funciona.

      como puedo quitar el index.php para llamar a otros controlados sin hacer una método que llame a este, se podrá hacer algo?

    4. Me surge la duda de que pasa si estoy utilizando los servicios de Azure como hago para modificar y colocarnos rewriterule on¿?

    5. hola, INTENTÉ eliminar el index.php como tu lo indicas en el tutorial pero al escribir la url sin el index.php me envía a la página de xammp

        • Hola buen día.
          Me pasa exactamente lo mismo…
          Por más que habilite:
          LoadModule rewrite_module modules/mod_rewrite.so
          en el Apache, siguiendo el instructivo para definir el archivo .htaccess y dejarlo a nivel de mi carpeta APP… NO puedo quitar el “index.php”!!!!?
          Es más en el “conf.php” del CI quite la asignación por defecto en la línea:
          $config[‘index_page’] = ”;
          Es posible que este tipo de configuración no se la correcta para la versión 3.1 de CodeIgniter. Si alguien pudo resolverlo se lo voy a agredecer.
          Un saludo cordial

          • Yo ahora estoy trabajando con un proyecto en CI 3, y el .htaccess es el que copié en el post.

            Sino probá con este:

            RewriteEngine on
            RewriteCond %{REQUEST_FILENAME} !-f
            RewriteCond %{REQUEST_FILENAME} !-d
            RewriteRule .* index.php/$0 [PT,L]

            Saludos!

            • Buen día
              El tema de prescindir del “index.php” depende de la versión del, en mi caso, EasyPHP. No en todas las versiones el “.htaccess” es efectivo. Y, no se recomienda tocar o modificar alguno parámetros del “httpd.conf” de Apache puesto que puede que algunas cosas en el Host local dejen de funcionar.
              Quitar el “index.php” no es tan sencillo como se muestra en varios tutoriales. Te puedo contar mi experiencia con el EasyPHP 2, 4, 5 y hasta la versión 6 y en cada caso tuve problemas. Y lo prove con versiones 2 y 3 de CI y en todos los casos no fue tan fácil.
              Si necesitas que comente mi experiencia no tengo problemas; pero sería importante que CI tenga esto resuelto desde el mismo framework y no tener que manosear archivos de configuración a nivel del Host Local….
              Se entiende?!
              Saludos

            • Siempre va a llegar un momento en que tengas que tocar el httpd o el php.ini, si lo hacés correctamente y sin miedo, entonces no hay ningún problema.

    6. Hola, le felicito por el tutorial que ha desarrollado, me esta viniendo genial para iniciarme en este framework, lo estás explicando muy bien paso a paso.

      Cuando he llegado al punto de quitar el “index.php”, no me funciona el código que has puesto, quizás sea con alguna incompatibilidad, uso wamp 3, y tengo activado el módulo mod.rewrite.

      Le pongo el siguiente código que me ha funcionado por si a alguien más le pasa:

      RewriteEngine on
      RewriteCond $1 !^(index.php|css|js|images)
      RewriteCond %{REQUEST_FILENAME} !-f
      RewriteCond %{REQUEST_FILENAME} !-d
      RewriteRule ^(.*)$ index.php/$1 [L,QSA]

      Saludos

    Deja un comentario

    Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *


    *