CodeIgniter 3 实现伪静态必须同步修改三处:config.php 中 $config['index_page'] = '' 和 uri_protocol(优先试 PATH_INFO),routes.php 中定义清晰路由规则,以及 Apache 的 .htaccess 正确重写(含 RewriteBase 适配子目录)。

CodeIgniter 3 要实现 URL 伪静态(即隐藏 index.php),必须同时改三处:配置文件、路由规则、服务器重写规则。只改其中一两处,99% 会失败。
修改 config.php 中的 index_page 和 uri_protocol
这两项不调对,.htaccess 再正确也白搭。常见错误是只改了 index_page 却忽略 uri_protocol,导致路由匹配失败或 404。
-
$config['index_page'] = '';—— 必须清空,否则生成的链接仍带index.php -
$config['uri_protocol']建议优先试'PATH_INFO',尤其在 Apache 共享主机或虚拟目录下;若不行再换'REQUEST_URI'或'QUERY_STRING' - 别碰
$config['url_suffix']来“假装伪静态”,它只加后缀(如.html),不解决index.php问题
在 routes.php 中定义干净的路由规则
路由本身不负责隐藏 index.php,但它决定了你最终想暴露的 URL 形态。如果没配好,即使重写生效,访问 /about 也可能进错控制器。
- 基础映射:
$route['about'] = 'pages/view/about';—— 访问/about就走Pages::view(),参数是about - 带数字 ID:
$route['article/(:num)'] = 'blog/read/$1';——$1是占位符捕获值,不是字面量 - 避免冲突:把具体规则(如
login)写在通用规则(如(:any))前面,否则后者会提前截断匹配 - 默认和 404 必须设:
$route['default_controller'] = 'home';和$route['404_override'] = 'errors/not_found';
Apache 下用 .htaccess 实现真实重写
这是最易出错的一环。很多教程给的规则在子目录或某些 Apache 版本下会 500 或循环重定向。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
立即学习“PHP免费学习笔记(深入)”;
- 确保服务器已启用
mod_rewrite,且对应目录的AllowOverride设为All(不能是None) -
.htaccess必须放在 CodeIgniter 项目根目录(与application/同级),内容推荐用这个稳定版本:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L]
- 注意末尾是
index.php/$1,不是index.php?/$1或index.php/$1 [QSA,L]—— 后者在 CI3 中可能破坏PATH_INFO解析 - 如果项目不在域名根目录(比如
http://example.com/myapp/),需在RewriteBase补路径:RewriteBase /myapp/
验证与排障关键点
很多问题表面是“不生效”,实际是某一层没响应请求。按顺序查比瞎试快得多。
- 直接访问
http://yoursite.com/index.php/about能打开?不能 → 检查控制器/方法是否存在、命名是否首字母大写(Pages.php)、权限是否正常 - 访问
http://yoursite.com/about返回 404?→ 先确认.htaccess是否被读取(可故意写错语法看是否 500);再检查uri_protocol是否匹配服务器环境 - 访问
/about跳转成/index.php/about?→ 说明 CI 内部生成链接时仍含index.php,回头再核$config['index_page'] = ''; - 本地开发用 XAMPP/MAMP 时,默认
AllowOverride None,必须手动改 Apache 配置才能让.htaccess生效
真正卡住的地方,往往不是路由怎么写,而是 uri_protocol 和 .htaccess 的组合没对上服务器的实际解析方式。不同主机环境(共享空间、VPS、Docker)表现差异很大,别迷信“一套规则通吃”。


















