CodeIgniter要求URI路径严格匹配大小写规则:控制器类名首字母大写(如Blog.php),URI中对应段必须全小写(/blog);方法名必须全小写(如index、show),即使类中定义为Show(),URI用/show才有效;无index()方法时访问/controller会404。

URI路径必须匹配控制器类名和方法名的大小写规则
CodeIgniter 会把 URL 第一段(index.php/xxx 中的 xxx)当作控制器类名,第二段当作方法名。但类名文件必须首字母大写(如 Blog.php),而 URI 中必须全小写(如 /blog)。方法名也必须小写(如 index、hello),哪怕类里定义的是 public function Hello(),URI 写成 /blog/hello 也会 404。
常见错误现象:
- 访问
/Blog或/BLOG→ 404,因为控制器文件名是Blog.php,但 URI 必须是小写blog - 控制器里写了
public function Show(),却用/blog/Show访问 → 404,URI 中方法名必须小写show - 类名没继承
CI_Controller→ 直接报错或空白页,不是 404
默认方法 index() 的触发条件很明确
当 URI 只有控制器段,没有第二段时,CodeIgniter 自动调用该控制器的 index() 方法。也就是说,/blog 和 /blog/index 是等价的,都走 Blog::index()。
注意点:
-
index()是唯一能被“省略第二段”触发的方法;其他方法必须显式写出,比如/blog/comments - 如果控制器里没有
index(),又只访问/blog,就会 404 —— 不会 fallback 到其他方法 - 不能重写父类的
index(),否则可能破坏框架行为(比如影响路由解析)
参数通过 URI 后续分段自动传入方法参数
URI 中第三段及以后的内容,会按顺序作为字符串参数传给对应方法。例如 /products/shoes/sandals/123 会调用 Products::shoes($param1, $param2),其中 $param1 = 'sandals'、$param2 = '123'。
关键限制:
- 参数只支持字符串类型,不会自动转整型或布尔值;
123进来仍是字符串'123' - 参数个数必须严格匹配方法声明的形参个数;多或少都会导致 PHP Warning 或 500 错误
- 如果用了路由(
$route),实际传入的参数是路由重写后的结果,不是原始 URI 分段
Apache 和 Nginx 对 index.php 的处理差异直接影响可访问性
在 Apache 下,/index.php/blog 能正常工作,因为 mod_rewrite 默认把请求交给 index.php 处理;但在 Nginx 下,默认配置会尝试查找物理路径 index.php/blog,结果 404。
解决办法(Nginx 必须配):
- 在 server 块中添加
try_files $uri $uri/ /index.php?$query_string; - 确保
location ~ \.php$块里包含fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; - 别漏掉
index.php在index指令中,否则根路径访问会失败
这个环节最容易被忽略:开发环境用 Apache 没问题,一上 Nginx 就全挂,而且错误日志里往往只显示 “File not found”,根本看不出是 Web 服务器配置问题。


















