CodeIgniter 默认方法只能是 public 的 index(),因框架在路由分发时硬编码拼接 'index' 调用,不可配置;$route['default_controller'] 仅指定控制器,方法仍固定为 index();非 index 方法需用 _remap() 实现。

CodeIgniter 的默认方法(即未显式指定方法时自动调用的函数)必须是 index(),且不能靠配置“设置”出来——它由框架硬编码决定,唯一生效方式是确保该方法存在、可访问、命名正确。
为什么只有 index() 被识别为默认方法
CodeIgniter 在路由分发阶段会先尝试调用 URI 中指定的方法;若 URI 只有控制器名(如 /users),框架会**固定拼接字符串 'index' 作为方法名**去反射调用,不查配置、不走路由映射、不可覆盖。这不是约定,是源码级行为(见 Router::_set_method() 和控制器执行逻辑)。
-
index()必须是 public 方法,不能是_index()或Index() - 方法名大小写敏感:
Index()不会被识别,仅index()有效 - 即使你在
routes.php里写$route['users'] = 'users/home';,那也只是路由映射,不是“设默认方法”
$route['default_controller'] 控制的是控制器,不是方法
这个配置项只决定「根路径 /」或空 URI 时加载哪个控制器,例如:
$route['default_controller'] = 'welcome';
它等价于访问 /welcome,后续仍由框架自动补上 index 方法调用 —— 所以最终执行的是 Welcome::index(),不是你随便起名的方法。
- 你可以写
$route['default_controller'] = 'admin/dashboard';,此时会加载Admin控制器,并调用其dashboard()方法(因为斜杠后内容被当作方法名) - 但如果你写
$route['default_controller'] = 'admin';,那就一定调Admin::index(),没得选 - 不存在
$config['default_method']这种配置项
想让非 index() 方法响应空方法段?用 _remap()
如果需求是「访问 /posts 时实际执行 Posts::list_all() 而非 index()」,唯一可靠方式是覆写 _remap() 方法:
class Posts extends CI_Controller
{
public function _remap($method, $params = [])
{
if ($method === '' || !method_exists($this, $method)) {
$method = 'list_all';
}
return call_user_func_array([$this, $method], $params);
}
public function list_all()
{
// 你的逻辑
}
}
-
_remap()会拦截所有方法调用,包括index(),所以必须手动处理 fallback - 注意:若原方法存在但被拒绝访问(比如权限不足),你也得在
_remap()里做判断,框架不自动处理 - 此方案绕过默认机制,但代价是失去框架对方法存在性、访问控制的自动检查
容易忽略的关键点
很多人卡在「明明写了 home() 方法,也配了路由,但访问根路径还是 404」,问题往往不在方法本身,而在:
- 控制器文件名不是
Home.php(类名与文件名必须严格一致,首字母大写) -
$route['default_controller']指向的控制器中,index()方法确实不存在或拼错 - 用了子目录控制器(如
admin/Welcome.php),但$route['default_controller']没写成'admin/welcome' - URL 后缀或
uri_protocol配置异常,导致 URI 分段解析失败,$this->uri->segment(2)拿不到方法名











