第8课:URL路由

我们为了url美观整洁,当然更为了seo,经常会对url重写
重写规则五花八门,我这里推荐一种
http://host/index.php/control/action 不带参数
http://host/index.php/control/action/uid/1/name/test 带参数
相比 http://host/index.php?control=control&action=action&uid=1&name=test 是不是优雅了很多

那么问题来了,http://host/index.php/control/action/uid/1/name/test 这种url如果让程序识别呢?
方法也有很多,如果你用nginx或者apache,都可以修改配置文件,用正则加入url重写规则
nginx举例:
location / {
	rewrite ^/([0-9a-zA-Z]+)$ /index.php?a=$1 last;
	rewrite ^/([a-zA-Z]+)/([0-9a-zA-Z]+)$ /index.php?a=$1&id=$2 last;
}
但是这样有个弊端,就是不够灵活
而且一般情况下服务器在公司都是运维掌握,程序员如果修改重写规则就不那么容易方便

大部分PHP框架也是在代码中实现路由的,实现原理:
对url用"/"分割成一个数组,然后根据规则,赋予对应数组值以某种意义
拿 http://host/index.php/control/action/uid/1/name/test 举例
<?php
$part = explode('/', trim($_SERVER['REQUEST_URI'], '/'));
if (!empty($part)) {
    krsort($part);
    $data['m'] = array_pop($part);//m=index.php
    $data['c'] = array_pop($part);//c=control
    $data['a'] = array_pop($part);//a=action
    ksort($part);
    //下面是对参数的处理,无非根据奇偶性来确定是参数名还是参数值
    $part = array_values($part);
    $tmp = array();
    if (count($part) > 0) {
	foreach ($part as $k => $v) {
	    if ($k % 2 == 0) {
		$tmp[$v] = isset($part[$k + 1]) ? $part[$k + 1] : '';
	    }
	}
    }
}
?>