CodeIgniter default controller in a sub directory not working

For each sub-folder in your controllers folder you must specify a default controller in routes.php. The built in $route['default_controller'] will not work for sub-folders.

e.g: For setting the default controller for you folder sub-folder to home add the following to your /application/config/routes.php file:

$route['folder'] = "folder/home";

which means http://mysite.com/folder/ is the same as http://mysite.com/folder/home as URL.


You can extend system router as per requirements,

  1. Create My_Router.php in application/core/ directory

/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */

/**
 * Description of My_Router
 *
 * @author girish
 */
class My_Router extends CI_Router {

    //put your code here
    public function __construct($routing = NULL) {
        parent::__construct($routing);
    }

    protected function _set_default_controller() {
    if (empty($this->default_controller)) {
        show_error('Unable to determine what should be displayed. A default route has not been specified in the routing file.');
    }

    // Is the method being specified?
    if (sscanf($this->default_controller, '%[^/]/%[^/]/%s', $directory, $class, $method) !== 3) {
        $method = 'index';
    }
    if (is_dir(APPPATH . 'controllers' . DIRECTORY_SEPARATOR . $directory) === true) {

        if (!file_exists(APPPATH . 'controllers' . DIRECTORY_SEPARATOR . $directory . DIRECTORY_SEPARATOR . ucfirst($class) . '.php')) {
            // This will trigger 404 later
            return;
        }
        $this->set_directory($directory);
        $this->set_class($class);
        $this->set_method($method);
    } else {
        if (sscanf($this->default_controller, '%[^/]/%s', $class, $method) !== 2) {
            $method = 'index';
        }
        if (!file_exists(APPPATH . 'controllers' . DIRECTORY_SEPARATOR . ucfirst($class) . '.php')) {
            // This will trigger 404 later
            return;
        }
        $this->set_class($class);
        $this->set_method($method);
    }
    // Assign routed segments, index starting from 1
    $this->uri->rsegments = array(
        1 => $class,
        2 => $method
    );

    log_message('debug', 'No URI present. Default controller set.');
   }

}

and overwrite _set_default_controller() from custom method, it will work from sub-directory controller as well root directory controller.

And in application/config/routes.php

if you need sub-directory default controller, then

 $route['default_controller'] = "admin/admins/login";
  • admin -- folder
  • admins -- controller
  • login -- method

if you need root-directory default controller, then

 $route['default_controller'] = "welcome/index";
  • welcome -- controller
  • index -- method

not sure it will work in all versions, but tested in CI3.0.6


If you want to stay flexible you need to pass on everything after the starting folder (in application/config/config.php):

$route['home'] = "home/whatever";
$route['home/(:any)'] = "home/whatever/$1";

Add this line in application/config/routes.php

$this->set_directory( "yourfoldername" );
$route['default_controller'] = 'controller name';