ci框架去除index.php需同时满足:web服务器重写生效(apache启用mod_rewrite、allowoverride all、.htaccess位置正确)、框架路由配置正确、清除浏览器302缓存,三者缺一不可。

为什么改了 $config['index_page'] = '' 还是跳转到 index.php?
这不是路由写错了,而是底层重写根本没生效。CI 的“友好 URL”依赖 Web 服务器转发所有请求到 index.php,框架才开始解析路由。如果浏览器地址栏还带着 index.php,说明 Apache 或 Nginx 根本没把请求交过去。
必须同时满足三个条件:
-
mod_rewrite已启用(phpinfo()查Loaded Modules是否含rewrite_module) - Apache 配置中对应目录的
AllowOverride All已设置(不能是None或FileInfo) -
.htaccess文件放在正确位置:CI3 在项目根目录(与index.php同级),CI4 必须在public/目录下
常见错觉是“文件放了就完事”,其实 Apache 不读它、不执行它、不转发请求,后面所有路由配置都白搭。浏览器缓存 302 跳转也会伪装问题,务必用隐身窗口测试。
$route 规则里哪些写法会失效?
CI 的路由匹配是顺序优先、字符串前缀匹配,不是正则全量匹配。很多看似合理的写法实际不会触发:
-
$route['catalog/product/(:any)'] = 'catalog/view/$1';—— 缺少结尾/或$,可能被更宽泛的规则吞掉 -
$route['backend/user/profile/(:num)/'] = 'backend/user/profile/$1';—— 如果 URL 实际是/backend/user/profile/204/disabled,而你只写了/204/,后半段会被丢弃或 404 - 使用空格、中文、点号等未转义字符直接写在 key 里(如
$route['关于我们'] = 'home/about';),Apache 可能提前 400,CI 根本收不到 - 把带查询参数的 URL(如
search?keyword=cat)当成路径去匹配 —— CI 的$route不处理$_GET,那是控制器自己该干的事
真正安全的写法是纯 ASCII 字符 + (:any) / (:num) 占位符,并确保目标控制器方法存在且可访问。
CI3 和 CI4 的 .htaccess 能混用吗?
不能。CI4 的入口文件在 public/index.php,而 CI3 是根目录下的 index.php。混用会导致 $_SERVER['SCRIPT_NAME'] 解析错误,整个路由系统失效,表现就是所有页面 500 或空白。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
CI3 标准规则(放项目根目录):
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L]
CI4 标准规则(放 public/ 目录):
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L]
关键区别不在内容,而在位置和上下文。CI4 若把 .htaccess 放错目录,或者修改了 public/index.php 的路径但没同步改规则,404 是必然结果。
想让 /about 映射到 pages/view/about,但 URL 后缀怎么加?
后缀是全局配置,不是单条路由控制的。设 $config['url_suffix'] = '.html' 后,所有 site_url() 生成的链接自动带 .html,但路由匹配时也得带后缀才能命中。
所以你要两步走:
- 在
config.php中设$config['url_suffix'] = '.html'; - 在
routes.php中写$route['about.html'] = 'pages/view/about';(注意后缀要显式写出)
否则,用户访问 /about.html 会 404;访问 /about 则按默认路由走,可能进首页或报错。这个细节很多人忽略,以为后缀只是“显示效果”,其实它参与路由解析全过程。










