4,250
社区成员




if($domain) {
$url = 'http://'.$domain.$url;
}else{
$url = "http://".$_SERVER['SERVER_NAME'].($_SERVER['SERVER_PORT']==80?'':':'.$_SERVER['SERVER_PORT']).$url;
}
生成的url永远是绝对地址,而我印象中他一直是相对路径,你把else删了吧// URL组装 支持不同模式
// 格式:U('[分组/模块/操作]?参数','参数','伪静态后缀','是否跳转','显示域名')
function U($url,$vars='',$suffix=true,$redirect=false,$domain=false) {
// 解析URL
$info = parse_url($url);
$url = !empty($info['path'])?$info['path']:ACTION_NAME;
// 解析子域名
if($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_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;
}
}
}
}
}
$flag=true;
if(C('URL_MODEL') == 0) { // 普通模式URL转换
$url =__APP__.'?'.http_build_query($var);
if(!empty($vars)) {
$vars = http_build_query($vars);
$url .= '&'.$vars;
}
$flag=false;
}
/**/
if(C('URL_MODEL') == 2){
$routes = C('URL_ROUTE_RULES');
$_url=array_merge(parseUrl($url),$vars);
foreach ($routes as $rule=>$route){
$_route=parseUrl(str_replace(':', '_',$route));
if(url_compare($_url, $_route))break;
}
if(url_compare($_url, $_route)){
foreach ($_route as $key=>$val){
if($key=='m'||$key=='a')continue;
$rule=preg_replace("/(\(\\\[\w]\+\))/",$_url[$key],$rule,1);
}
//去掉最后的"/"
$url=__APP__.'/'.trim($rule,'/');
$flag=false;
}
}
if($flag){ // PATHINFO模式或者兼容URL模式
if(isset($route)) {
$url = __APP__.'/'.$url;
}else{
$url = __APP__.'/'.implode($depr,array_reverse($var));
}
if(!empty($vars)) { // 添加参数
$vars = http_build_query($vars);
$url .= $depr.str_replace(array('=','&'),$depr,$vars);
}
if($suffix) {
$suffix = $suffix===true?C('URL_HTML_SUFFIX'):$suffix;
if($suffix) {
$url .= '.'.ltrim($suffix,'.');
}
}
}
//file_put_contents("out.txt",$url."\r\n",FILE_APPEND);
if($domain) {
$url = 'http://'.$domain.$url;
}else{
$url = "http://".$_SERVER['SERVER_NAME'].($_SERVER['SERVER_PORT']==80?'':':'.$_SERVER['SERVER_PORT']).$url;
}
if($redirect) // 直接跳转URL
redirect($url);
else
return $url;
}