如何配置CodeIgniter路由规则及URL重写详解?
- 内容介绍
- 文章标签
- 相关推荐
本文共计937个文字,预计阅读时间需要4分钟。
这不是一个有效的HTML标签,因为``标签通常用于创建超链接,而`style`属性用于定义样式,但在这里没有指定颜色值。正确的使用方式应该是:
必须同时满足三个条件:
-
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 或空白。
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 则按默认路由走,可能进首页或报错。这个细节很多人忽略,以为后缀只是“显示效果”,其实它参与路由解析全过程。
本文共计937个文字,预计阅读时间需要4分钟。
这不是一个有效的HTML标签,因为``标签通常用于创建超链接,而`style`属性用于定义样式,但在这里没有指定颜色值。正确的使用方式应该是:
必须同时满足三个条件:
-
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 或空白。
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 则按默认路由走,可能进首页或报错。这个细节很多人忽略,以为后缀只是“显示效果”,其实它参与路由解析全过程。

