Contents

codeigniter設定router踩雷

CodeIgniter 3 的路由設定是許多開發者容易踩雷的地方,尤其是 Linux/Windows 的大小寫差異,以及多層資料夾結構的路由設定限制。本文整理常見問題與解決方式。

路由設定檔位置

CodeIgniter 3 的路由設定檔在:

1
application/config/routes.php

基本路由設定

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
// 預設控制器(首頁)
$route['default_controller'] = 'Welcome';

// 404 頁面
$route['404_override'] = 'errors/page_404';

// 自訂路由
$route['about'] = 'pages/about';
$route['blog/(:num)'] = 'blog/post/$1';
$route['user/(:any)'] = 'user/profile/$1';

路由萬用字元

萬用字元 說明 範例
(:any) 任意字元(含 / 'user/(:any)'
(:num) 只允許數字 'post/(:num)'
1
2
3
4
5
6
7
// 捕捉任意路徑
$route['product/(:any)'] = 'product/show/$1';
// 例如 /product/electronics/phone → product/show/electronics/phone

// 只允許數字 ID
$route['article/(:num)'] = 'article/view/$1';
// 例如 /article/123 → article/view/123

大小寫問題(Linux vs Windows)

這是最常踩雷的地方!

在 Windows 環境開發時,控制器檔名大小寫不影響運作(Windows 檔案系統不區分大小寫)。但部署到 Linux 伺服器後就會出現 404,因為 Linux 嚴格區分大小寫。

1
2
3
4
5
// ❌ 錯誤:路由設定為小寫,但 Controller 檔名是大寫開頭
$route['default_controller'] = 'welcome'; // 對應 application/controllers/welcome.php

// ✅ 正確:路由設定與 Controller 檔名一致
$route['default_controller'] = 'Welcome'; // 對應 application/controllers/Welcome.php

命名規則

  • 控制器檔名:首字母大寫,例如 Welcome.phpUserProfile.php
  • 類別名稱與檔名相同:class Welcome extends CI_Controller
  • 路由設定可以使用小寫 URL,但對應的控制器名稱必須正確
1
2
// URL 可以小寫,路由對應到正確的 Controller
$route['user-profile'] = 'UserProfile/index';

子資料夾 Controller 的限制

CodeIgniter 3 的路由設定不支援超過兩層的 Controller 資料夾。例如:

1
2
application/controllers/admin/user/UserController.php  ← 不支援
application/controllers/admin/UserController.php       ← 支援

若不想改動原有目錄結構,可以用 include + 繼承的方式處理:

1
2
3
4
5
6
7
8
9
// application/controllers/Welcome.php
class Welcome extends CI_Controller {
    public function index() {
        // include 深層資料夾的控制器邏輯
        include APPPATH . 'controllers/admin/user/UserController.php';
        $ctrl = new UserController();
        $ctrl->index();
    }
}

注意include 的路徑必須從 APPPATH(即 application/ 目錄)開始計算,不能使用相對路徑。

完整路由設定範例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
// application/config/routes.php

// 預設路由
$route['default_controller'] = 'Home';
$route['404_override'] = 'Errors/notFound';
$route['translate_uri_dashes'] = FALSE;

// 一般頁面
$route['about'] = 'Pages/about';
$route['contact'] = 'Pages/contact';

// 文章路由
$route['blog'] = 'Blog/index';
$route['blog/(:num)'] = 'Blog/view/$1';
$route['blog/category/(:any)'] = 'Blog/category/$1';

// 後台(子資料夾 Controller)
$route['admin'] = 'admin/Dashboard/index';
$route['admin/users'] = 'admin/Users/index';
$route['admin/users/(:num)'] = 'admin/Users/edit/$1';

查看所有已定義路由(除錯用)

1
2
3
// 在任意 Controller 中暫時加入,用於除錯
$routes = $this->router->routes;
print_r($routes);

參考資料