一、如: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;
} 