codeigniter 404错误主因是路由与控制器配置不匹配,需依次检查web服务器重写规则、路由注册、控制器命名规范及缓存环境;apache需确认.htaccess和allowoverride,nginx需验证try_files和root路径;路由必须显式定义且顺序合理;控制器文件名、类名、命名空间须严格匹配;清除缓存并设为development环境以确保调试生效。

CodeIgniter 路由和控制器配置不匹配,90% 的表现是 404 错误——请求根本没进框架,不是逻辑出错,而是“路没修通”。排查要从请求入口开始,一层层验证是否连通。
检查 Web 服务器重写是否生效
这是最常被忽略的第一环。如果 http://localhost/index.php/home 能打开,但 http://localhost/home 报 404,说明重写规则没起作用。
- Apache 用户:确认
public/.htaccess存在且内容完整,尤其检查RewriteRule ^(.*)$ index.php/$1 [L]中的/$1是否带斜杠(漏掉会导致 URI 段丢失); - 确认
httpd.conf中对应目录设置了AllowOverride All; - Nginx 用户:直接检查 server 块是否有
try_files $uri $uri/ /index.php?$query_string;,且root指向的是public/目录。
验证路由定义是否正确注册
CI4 不自动发现控制器,所有路径必须显式声明。访问前先运行命令看当前有效路由:
- 终端执行
php spark routes,确认/home或你目标路径是否出现在列表中; - 检查
app/Config/Routes.php中是否写了类似$routes->get('/home', 'Home::index');; - 注意顺序:通配符路由(如
$routes->get('(:any)', ...))必须放在具体路由之后,否则会提前截断; - 区分 HTTP 方法:GET 请求不能用
$routes->post()定义,否则表单提交也会 404。
核对控制器文件、类名与命名空间
CI 对大小写和命名规范极其敏感,尤其部署到 Linux 服务器时:
- 文件名必须首字母大写:
Home.php(不是home.php或HomeController.php); - 类名必须与文件名完全一致:
class Home extends BaseController; - 命名空间必须为
App\Controllers(CI4 默认),不能漏掉或写成app\controllers; - 方法必须是
public,且不能是 PHP 魔术方法(如__invoke),index()是默认入口,但路由指向其他方法时,该方法必须存在。
排除缓存与环境干扰
CI4 会缓存路由配置,开发阶段容易因旧缓存导致“改了没生效”:
- 执行
php spark cache:clear清除全部缓存; - 确认
.env中CI_ENVIRONMENT = development,确保错误信息可显示; - 检查
app/Config/App.php中public $baseURL = 'http://localhost/';是否正确(末尾带斜杠),否则生成的 URL 可能拼接错误; - 临时启用
$routes->set404Override('Errors::show');并在Errors控制器里打印调试信息,确认未匹配路由是否真被拦截。










