codeigniter 3 的 index.php 是必需入口文件,url 中必须显式包含,如 http://localhost/myapp/index.php/welcome;若省略则 web 服务器直接返回 404,因请求未交由框架处理。

确认 index.php 是否被正确包含在 URL 中
CodeIgniter 3 默认依赖 index.php 作为入口文件。如果你直接访问 http://localhost/myapp/welcome(不带 index.php),Apache/Nginx 会尝试找一个叫 welcome 的静态文件,找不到就返回 404 —— 这不是路由问题,是 Web 服务器根本没把请求交给 CI 处理。
先验证:手动在浏览器中输入 http://localhost/myapp/index.php/welcome。如果能正常显示 Welcome 页面,说明框架本身没问题,问题出在 URL 重写配置上。
- 若能访问,继续检查
.htaccess和config.php; - 若仍 404,检查 Apache 是否启用
mod_rewrite,或 Nginx 是否配置了正确的try_files规则; - 若连
index.php都报 404,说明项目未部署到 Web 根目录下,或虚拟主机 DocumentRoot 指向错误路径。
检查 .htaccess 与 config.php 的 URL 重写配合
要让 /welcome 这类“干净 URL”生效,必须同时满足两个条件:Web 服务器允许重写 + CI 配置承认重写结果。缺一不可。
Apache 下,在项目根目录放好 .htaccess:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L]
然后修改 application/config/config.php:
-
$config['index_page'] = '';(清空,不能留空格) -
$config['uri_protocol'] = 'AUTO';(推荐)或显式设为'REQUEST_URI'(某些 FastCGI 环境更稳)
注意:.htaccess 必须放在和 index.php 同级的目录,且 Apache 的 AllowOverride All 已在虚拟主机配置中启用,否则规则不生效。
验证控制器文件名与类名是否严格匹配
CodeIgniter 3 对大小写极其敏感:控制器文件名必须全小写(如 welcome.php),内部类名必须首字母大写且与文件名同名(class Welcome extends CI_Controller)。哪怕写成 Welcome.php 或 class welcome,都会导致 404。
常见错误现象:
- 访问
/welcome报 404,但/index.php/welcome也报 404 → 检查文件名和类名; - 控制器里方法名含大写字母(如
getUsers())→ URL 中必须用小写加下划线(/welcome/get_users); - 控制器未继承
CI_Controller或拼错(如CI_controller)→ 直接拒绝加载。
404 页面自身崩溃:base_url() 报错怎么办
当真正触发 404(比如访问不存在的 /xyz)时,如果自定义的 404 视图里写了 base_url() 却没加载 url 辅助函数,就会抛出 Fatal error: Call to undefined function base_url() —— 你看到的不是 404 页面,而是 PHP 致命错误。
修复方式只有两种,且必须选其一:
- 在自定义 404 控制器方法中手动加载:
$this->load->helper('url');(推荐,精准可控); - 在
application/config/autoload.php中把'url'加入$autoload['helper']数组(简单,但所有请求都多加载一次)。
绝对不要在 404 视图里直接调用 base_url() 而不确认 helper 已加载 —— 这是线上最常被忽略的崩溃点,也是排查时最容易绕晕人的地方。











