
在 CodeIgniter 4 中,直接通过 index.php/ControllerName 访问控制器会失败;必须通过显式定义路由(如 $routes->get('contact', 'ContactController::index'))并启用重写规则,才能以干净 URL(如 /contact)访问控制器方法。
在 codeigniter 4 中,直接通过 index.php/controllername 访问控制器会失败;必须通过显式定义路由(如 $routes->get('contact', 'contactcontroller::index'))并启用重写规则,才能以干净 url(如 /contact)访问控制器方法。
CodeIgniter 4 彻底摒弃了 CI3 的“自动控制器发现”机制——不再支持通过 URL 路径(如 /index.php/Home)隐式映射到控制器类名。所有控制器访问都必须经由显式路由声明,这是安全性和可维护性的关键设计。
✅ 正确配置步骤
-
创建控制器(遵循命名规范)
控制器类名必须以Controller结尾,且文件名与类名严格一致(如ContactController.php),并置于app/Controllers/目录下:
// app/Controllers/ContactController.php
<?php namespace App\Controllers;
use CodeIgniter\Controller;
class ContactController extends BaseController
{
public function index()
{
return view('contact/index'); // 或 echo 'Hello from Contact!';
}
}-
在路由文件中注册路由
编辑app/Config/Routes.php,在$routes实例上添加明确的 HTTP 方法路由(推荐使用get()、post()等,而非通配add()):
// app/Config/Routes.php(关键片段)
$routes->get('/', 'Home::index'); // 默认首页
$routes->get('contact', 'ContactController::index'); // ✅ 显式绑定
$routes->get('contact/about', 'ContactController::about');⚠️ 注意:
Home::index是 CI4 内置默认路由示例,但Home控制器需真实存在且类名为Home(非HomeController),否则同样 404。若自定义控制器,请统一使用XxxController命名。
-
确保 Web 服务器支持 URL 重写
-
Apache:确认
.htaccess文件存在于public/目录且已启用mod_rewrite;访问http://localhost/contact即可生效(无需index.php)。 -
Nginx:需配置
try_files $uri $uri/ /index.php?$query_string;规则。 -
开发环境(CLI Server):运行
php spark serve后,直接访问http://localhost:8080/contact即可。
-
Apache:确认
❌ 常见错误与排查
-
错误写法:
localhost/CI4/public/index.php/Home→ CI4 不解析此类路径,强制返回 404。 -
控制器未加
Controller后缀:如class Home extends BaseController→ 应为class HomeController extends BaseController,否则路由匹配失败。 -
命名空间或文件路径错误:控制器必须在
App\Controllers\命名空间下,且物理路径为app/Controllers/XXXController.php。 -
缓存未清除:修改路由后执行
php spark routes查看当前有效路由列表,并运行php spark cache:clear清理路由缓存。
✅ 验证与调试建议
运行以下命令快速验证路由是否生效:
当代理已经知道网站路由或内容URL,并且在启动前需要有效的sitemap XML、sitemap索引或robots.txt引用时,请使用sitemap。这是一个发布构件技能,而不是爬虫或SEO平台。
php spark routes
输出中应包含类似:
+------+----------------+-------------------------------+ | Method | Route | Handler | +------+----------------+-------------------------------+ | GET | / | App\Controllers\Home::index | | GET | contact | App\Controllers\ContactController::index | +------+----------------+-------------------------------+
总结:CI4 的路由是“显式优先、约定为辅”。放弃对 index.php/Controller/Method 的依赖,拥抱清晰、安全、可测试的路由声明——这不仅是解决 404 的关键,更是构建可扩展应用的基础实践。










