一般情况下,一个 URL 字符串和它对应的控制器中类和方法是一一对应的关系。 URL 中的每一段通常遵循下面的规则:
example.com/class/function/id/
但是有时候,你可能想改变这种映射关系,调用一个不同的类和方法,而不是 URL 中对应的那样。
URL 路由的作用就是对URL进行重定向 —— 也就是,实现对URL 的定制!
CI中,定义路由规则是在 application/config/routes.php 文件中,在这个文件中你会 发现一个名为 $route 的数组,利用它你可以设置你自己的路由规则。在路由规则中你可以使用通配符或正则表达式。
1、通配符
一个典型的使用通配符的路由规则如下:
$route['product/:num'] = 'catalog/product_lookup'; // 如果 URL 的第一段是字符串 "product" ,第二段是个数字,那么, 将调用 "catalog" 类的 "product_lookup" 方法。
在一个路由规则中,数组的键表示要匹配的 URI ,而数组的值表示要重定向的位置。
(:num) 匹配只含有数字的一段。 (:any) 匹配含有任意字符的一段。(除了 '/' 字符,因为它是段与段之间的分隔符)
(1)通配符实际上是正则表达式的别名,:any 会被转换为 [^/]+ , :num 会被转换为 [0-9]+ 。
(2)路由规则将按照它们定义的顺序执行,前面的规则优先级高于后面的规则。
(3)路由规则并不是过滤器!设置一个这样的路由:'foo/bar/(:num)' , Foo 控制器的 bar 方法还是有可能会通过一个非数字的参数被调用 (如果这个路由也是合法的话)。
2、使用正则或者回调函数的形式来定义路由规则
$route['products/([a-z]+)/(d+)'] = '$1/id_$2';
$route['login/(.+)'] = 'auth/login/$1';
$route['products/([a-zA-Z]+)/edit/(d+)'] = function ($product_type, $id) { return 'catalog/product_edit/' . strtolower($product_type) . '/' . $id; };
3、CI中有三个保留路由规则。保留的路由规则必须位于任何一般的通配符或正则路由的前面。