CodeIgniter 3(HMVC架构)路由404错误求助:控制器已存在但无法访问(MX_Controller相关问题)
CodeIgniter 3(HMVC架构)路由404错误求助:控制器已存在但无法访问(MX_Controller相关问题)
嘿,我来帮你捋捋这个HMVC下的404坑!你现在的情况是拿到了一个现成的CI3 HMVC项目(用MX_Controller),要做登录功能,控制器明明已经建好了,但访问http://localhost:8000/login或者带index.php的路径都跳404,这确实挺闹心的,我帮你从几个常见排查点入手:
- 先盯紧控制器的命名和目录结构:HMVC对这个要求特别严,尤其是PHP8.1对大小写更敏感了!比如你的登录控制器,得放在
application/modules/login/controllers/目录下,文件名必须是Login.php,类名也得是class Login extends MX_Controller,大小写半毛钱都不能错,别写成小写的login.php或者类名login,系统根本识别不到。 - 检查路由配置有没有到位:你是在模块的
routes.php还是主项目的application/config/routes.php里配的?HMVC下默认路由规则是模块名/控制器名/方法名,所以如果你的登录控制器默认方法是index,得配成$route['login'] = 'login/login/index';,或者简化成$route['login'] = 'login/login';(因为index是默认方法)。另外主配置里的$config['enable_query_strings']要是设成true的话,访问方式就变成index.php?c=login&m=index了,先确认这个值是默认的false。 - 确认模块被系统正确识别:你可以在主控制器里加一行
$this->load->module('login');试试,如果报错说找不到模块,要么是你的模块目录结构错了,要么是application/config/config.php里的$config['modules_locations']配置乱了,默认应该是$config['modules_locations'] = array(APPPATH.'modules/' => '../modules/');,别改得偏离这个格式。 - 扒一扒日志里的具体错误:你说日志有内容,比如是不是提示“Unable to locate the specified class: Login.php”?如果是,那90%是文件名/类名大小写不匹配,或者你多给控制器加了命名空间——HMVC下用MX_Controller的话,控制器不需要加命名空间,画蛇添足反而会导致找不到类。
- 排查**.htaccess的锅**:如果你是想去掉index.php访问的,先确认你的.htaccess配置对不对,CI3 HMVC下的标准配置应该是这样的:
RewriteEngine On RewriteBase / RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php?/$1 [L]
如果你的项目不是放在localhost根目录,RewriteBase要改成你的项目路径,比如RewriteBase /your-project-name/。另外别忘了确认Apache的mod_rewrite模块是开启的,这个模块没开的话,伪静态路由直接失效,自然就404了。
- 试试直接访问完整路由:比如访问
http://localhost:8000/index.php/login/login,也就是模块名/控制器名,如果能正常访问,那就是你主路由配置错了,没把/login映射到正确的模块控制器上。
备注:内容来源于stack exchange,提问作者Jean Claro
相关产品推荐
相关产品推荐

