3.1路由支持自定义

浏览:2579 发布日期:2014/03/28 分类:系统代码 关键字: 自定义链接 伪静态
大家都知道SEO的重要性,官方提供的路由不支持随心所遇的自定义URL;在cms项目开发时这个问题是很大的困扰。未解决这个经过反复测试终于修成正果了。
基于官方提供的路由插件小做修改让路由实现自定义。
并不是很完善,可以完全兼容根目录访问。不支持后缀和二级目录!
哪位大神如果感兴趣可以继续修改改善。我是在3.1版本上做的修改,不过大致看了下在3.2版本稍作修改也是通用的。废话不多少直接贴代码了
首先修改下U方法
最终效果显示 例如访问user模块的reg方法 显示结果为 http://ml.topcms.pw/reg 这里的reg你可以自定义随意修改无需配置服务器function U($url='',$vars='',$suffix=true,$redirect=false,$domain=true) {
    // 解析URL
    $info   =  parse_url($url);
    $url    =  !empty($info['path'])?$info['path']:ACTION_NAME;
    if(false !== strpos($url,'@')) { // 解析域名
        list($url,$host)    =   explode('@',$info['path'], 2);
    }
    // 解析子域名
    if(isset($host)) {
        $domain = $host.(strpos($host,'.')?'':strstr($_SERVER['HTTP_HOST'],'.'));
    }elseif($domain===true){
        $domain = $_SERVER['HTTP_HOST'];
        if(C('APP_SUB_DOMAIN_DEPLOY') ) { // 开启子域名部署
            $domain = $domain=='localhost'?'localhost':'www'.strstr($_SERVER['HTTP_HOST'],'.');
            // '子域名'=>array('项目[/分组]');
            foreach (C('APP_SUB_DOMAIN_RULES') as $key => $rule) {
                if(false === strpos($key,'*') && 0=== strpos($url,$rule[0])) {
                    $domain = $key.strstr($domain,'.'); // 生成对应子域名
                    $url    =  substr_replace($url,'',0,strlen($rule[0]));
                    break;
                }
            }
        }
    }

    // 解析参数
    if(is_string($vars)) { // aaa=1&bbb=2 转换成数组
        parse_str($vars,$vars);
    }elseif(!is_array($vars)){
        $vars = array();
    }
    if(isset($info['query'])) { // 解析地址里面参数 合并到vars
        parse_str($info['query'],$params);
        $vars = array_merge($params,$vars);
    }

    // URL组装
    $depr = C('URL_PATHINFO_DEPR');
    if($url) {
        if(0=== strpos($url,'/')) {// 定义路由
            $route      =   true;
            $url        =   substr($url,1);
            if('/' != $depr) {
                $url    =   str_replace('/',$depr,$url);
            }
        }else{
            if('/' != $depr) { // 安全替换
                $url    =   str_replace('/',$depr,$url);
            }
            // 解析分组、模块和操作
            $url        =   trim($url,$depr);
            $path       =   explode($depr,$url);
            $var        =   array();
            $var[C('VAR_ACTION')]       =   !empty($path)?array_pop($path):ACTION_NAME;
            $var[C('VAR_MODULE')]       =   !empty($path)?array_pop($path):MODULE_NAME;
            if(C('URL_CASE_INSENSITIVE')) {
                $var[C('VAR_MODULE')]   =   parse_name($var[C('VAR_MODULE')]);
            }
            if(!C('APP_SUB_DOMAIN_DEPLOY') && C('APP_GROUP_LIST')) {
                if(!empty($path)) {
                    $group                  =   array_pop($path);
                    $var[C('VAR_GROUP')]    =   $group;
                }else{
                    if(GROUP_NAME != C('DEFAULT_GROUP')) {
                        $var[C('VAR_GROUP')]=   GROUP_NAME;
                    }
                }
                if(C('URL_CASE_INSENSITIVE') && isset($var[C('VAR_GROUP')])) {
                    $var[C('VAR_GROUP')]    =  strtolower($var[C('VAR_GROUP')]);
                }
            }
        }
    }

    if(C('URL_MODEL') == 0) { // 普通模式URL转换
        $url        =   __APP__.'?'.http_build_query(array_reverse($var));
        if(!empty($vars)) {
            $vars   =   urldecode(http_build_query($vars));
            $url   .=   '&'.$vars;
        }
    }else{ // PATHINFO模式或者兼容URL模式
        if(C('URL_ROUTER_ON') && (C('URL_MODEL') == 2) && ($var[C('VAR_GROUP')] == '' || $var[C('VAR_GROUP')] == 'Home') ){
            $url        =   __APP__.'?'.http_build_query(array_reverse($var));
            if(!empty($vars)) {
                $vars   =   urldecode(http_build_query($vars));
                $url   .=   '&'.$vars;
            }
            if( is_array(C('URL_ROUTE_RULES')) ){
                foreach (C('URL_ROUTE_RULES') as $route_key => $route_val) {
                    preg_match('#'.$route_val.'$#', $url ,$metches);
                    if($metches){
                       $route_url=$metches;
                       $rule=$route_key;
                    }
                }
                if($route_url){
                    $url_new=explode(':', $rule);
                    $u=$url_new[0];
                    for($i=1;$i<count($url_new);$i++){
                        $u.=$route_url[$i].'/';
                    }
                    $u=  trim($u,'/');
                    $url=str_replace ('/', $depr, $u);
                }
            }
        }else{
            if(isset($route)) {
                $url    =   __APP__.'/'.rtrim($url,$depr);
            }else{
                $url    =   __APP__.'/'.implode($depr,array_reverse($var));
            }
            if(!empty($vars)) { // 添加参数
                foreach ($vars as $v => $val){
                    if('' !== trim($val))   $url .= $depr . $v . $depr . urlencode($val);
                }  
            }
        }
        //路由过滤

        if($suffix) {
            $suffix   =  $suffix===true?C('URL_HTML_SUFFIX'):$suffix;
            if($pos = strpos($suffix, '|')){
                $suffix = substr($suffix, 0, $pos);
            }
            if($suffix && '/' != substr($url,-1)){
                $url  .=  '.'.ltrim($suffix,'.');
            }
        }
    }
    if($domain) {
        $url   =  (is_ssl()?'https://':'http://').$domain.__ROOT__.'/'.$url;
    }

    if($redirect) // 直接跳转URL
        redirect($url);
    else
        return $url;
}
其次对应的修改下路由行为这里我直接把文件附在下面。有兴趣的可以下载看看。
具体效果可以看本人做的项目
http://ml.topcms.pw

附件 CheckRouteBehavior.class.php.zip ( 2.72 KB 下载:53 次 )

评论( 相关
后面还有条评论,点击查看>>