如何配置CodeIgniter路由规则及URL重写详解?

2026-04-29 12:274阅读0评论SEO问题
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计937个文字,预计阅读时间需要4分钟。

如何配置CodeIgniter路由规则及URL重写详解?

这不是一个有效的HTML标签,因为``标签通常用于创建超链接,而`style`属性用于定义样式,但在这里没有指定颜色值。正确的使用方式应该是:

必须同时满足三个条件:

  • mod_rewrite 已启用(phpinfo()Loaded Modules 是否含 rewrite_module
  • Apache 配置中对应目录的 AllowOverride All 已设置(不能是 NoneFileInfo
  • .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分钟。

如何配置CodeIgniter路由规则及URL重写详解?

这不是一个有效的HTML标签,因为``标签通常用于创建超链接,而`style`属性用于定义样式,但在这里没有指定颜色值。正确的使用方式应该是:

必须同时满足三个条件:

  • mod_rewrite 已启用(phpinfo()Loaded Modules 是否含 rewrite_module
  • Apache 配置中对应目录的 AllowOverride All 已设置(不能是 NoneFileInfo
  • .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 则按默认路由走,可能进首页或报错。这个细节很多人忽略,以为后缀只是“显示效果”,其实它参与路由解析全过程。