U方法建议

浏览:1606 发布日期:2015/03/28
在使用U方法生成二级域名时 遇到 这样 一些 问题
一、如:http://127.0.0.1/Home/Index/index.html 会变成:http://www.0.0.1/Home/Index/index.html(这是不需要看到的)
二、开启二级域名时,就不能 生成 一级域名
三、多级域名生成

解决一、在U方法判断$domain是否为"localhost"时 加上正则判断是否为ip访问
解决二、也是判断$domain是否为"localhost"时,否则就是直接生成了www开始的域名, 然后再后面 子域名生成规则中循环判断是否要生成子域名 进行了www替换为配置的子域名

下面是我的处理方法 如果要生成 www.****.com域名 这属于子域名配置/**
 * URL组装 支持不同URL模式
 *
 * @param string         $url    URL表达式,格式:'[模块/控制器/操作#锚点@域名]?参数1=值1&参数2=值2...'
 * @param string|array   $vars   传入的参数,支持数组和字符串
 * @param string|boolean $suffix 伪静态后缀,默认为true表示获取配置值
 * @param boolean        $domain 是否显示域名
 *
 * @return string
 */
function U ( $url = '', $vars = '', $suffix = true, $domain = false ) {
    // 解析URL
    $info = parse_url ( $url );
    $url  = !empty( $info['path'] ) ? $info['path'] : ACTION_NAME;
    if ( isset( $info['fragment'] ) ) { // 解析锚点
        $anchor = $info['fragment'];
        if ( false !== strpos ( $anchor, '?' ) ) { // 解析参数
            list( $anchor, $info['query'] ) = explode ( '?', $anchor, 2 );
        }
        if ( false !== strpos ( $anchor, '@' ) ) { // 解析域名
            list( $anchor, $host ) = explode ( '@', $anchor, 2 );
        }
    } elseif ( 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' ) ) { // 开启子域名部署
            // ip 正则地址
            $pregIp = '/^(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9])\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[0-9])$/';
            // 判断 $domain 不是 localhost 并且不是ip
            if ( $domain != 'localhost' && !preg_match ( $pregIp, $domain ) ) {
                // 读取 域名后缀
                $sDomainSuffix = C ( "APP_DOMAIN_SUFFIX" );

                $sDomainSuffix != "" && $sDomainSuffix = ".{$sDomainSuffix}";
                $aDomainItme = explode ( ".", str_replace ( $sDomainSuffix, "", $_SERVER['HTTP_HOST'] ) );
                if ( count ( $aDomainItme ) >= 2 ) {
                    $sDomainItem = $aDomainItme[1];
                    unset( $aDomainItme[0], $aDomainItme[1] );

                    foreach ( $aDomainItme as $v ) {
                        $sDomainItem .= ".{$v}";
                    }
                    $domain = $sDomainItem . $sDomainSuffix;
                } else {
                    $domain = $aDomainItme[0] . $sDomainSuffix;
                }
            }

            // '子域名'=>array('模块[/控制器]');
            foreach ( C ( 'APP_SUB_DOMAIN_RULES' ) as $key => $rule ) {
                $rule = is_array ( $rule ) ? $rule[0] : $rule;
                if ( false === strpos ( $key, '*' ) && 0 === strpos ( $url, $rule ) ) {
                    $domain = "{$key}.{$domain}"; // 生成对应子域名
                    $url    = substr_replace ( $url, '', 0, strlen ( $rule ) );
                    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' );
    $urlCase = C ( 'URL_CASE_INSENSITIVE' );
    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 ();
            $varModule           = C ( 'VAR_MODULE' );
            $varController       = C ( 'VAR_CONTROLLER' );
            $varAction           = C ( 'VAR_ACTION' );
            $var[$varAction]     = !empty( $path ) ? array_pop ( $path ) : ACTION_NAME;
            $var[$varController] = !empty( $path ) ? array_pop ( $path ) : CONTROLLER_NAME;
            if ( $maps = C ( 'URL_ACTION_MAP' ) ) {
                if ( isset( $maps[strtolower ( $var[$varController] )] ) ) {
                    $maps = $maps[strtolower ( $var[$varController] )];
                    if ( $action = array_search ( strtolower ( $var[$varAction] ), $maps ) ) {
                        $var[$varAction] = $action;
                    }
                }
            }
            if ( $maps = C ( 'URL_CONTROLLER_MAP' ) ) {
                if ( $controller = array_search ( strtolower ( $var[$varController] ), $maps ) ) {
                    $var[$varController] = $controller;
                }
            }
            if ( $urlCase ) {
                $var[$varController] = parse_name ( $var[$varController] );
            }
            $module = '';

            if ( !empty( $path ) ) {
                $var[$varModule] = implode ( $depr, $path );
            } else {
                if ( C ( 'MULTI_MODULE' ) ) {
                    if ( MODULE_NAME != C ( 'DEFAULT_MODULE' ) || !C ( 'MODULE_ALLOW_LIST' ) ) {
                        $var[$varModule] = MODULE_NAME;
                    }
                }
            }
            if ( $maps = C ( 'URL_MODULE_MAP' ) ) {
                if ( $_module = array_search ( strtolower ( $var[$varModule] ), $maps ) ) {
                    $var[$varModule] = $_module;
                }
            }
            if ( isset( $var[$varModule] ) ) {
                $module = $var[$varModule];
                unset( $var[$varModule] );
            }

        }
    }

    if ( C ( 'URL_MODEL' ) == 0 ) { // 普通模式URL转换
        $url = __APP__ . '?' . C ( 'VAR_MODULE' ) . " ={
                            $module}&" . http_build_query ( array_reverse ( $var ) );
        if ( $urlCase ) {
            $url = strtolower ( $url );
        }
        if ( !empty( $vars ) ) {
            $vars = http_build_query ( $vars );
            $url .= '&' . $vars;
        }
    } else { // PATHINFO模式或者兼容URL模式
        if ( isset( $route ) ) {
            $url = __APP__ . '/' . rtrim ( $url, $depr );
        } else {
            $module = ( defined ( 'BIND_MODULE' ) && BIND_MODULE == $module ) ? '' : $module;
            $url    = __APP__ . '/' . ( $module ? $module . MODULE_PATHINFO_DEPR : '' ) . implode ( $depr, array_reverse ( $var ) );
        }
        if ( $urlCase ) {
            $url = strtolower ( $url );
        }
        if ( !empty( $vars ) ) { // 添加参数
            foreach ( $vars as $var => $val ) {
                if ( '' !== trim ( $val ) ) {
                    $url .= $depr . $var . $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 ( isset( $anchor ) ) {
        $url .= '#' . $anchor;
    }
    if ( $domain ) {
        $url = ( is_ssl () ? 'https://' : 'http://' ) . $domain . $url;
    }

    return $url;
}
评论()
后面还有条评论,点击查看>>