根据URL初始化
null Bootstrap::setup_by_url( )
private static function setup_by_url(&$request_mode)
{
# 当没有$_SERVER["SCRIPT_URL"] 时拼接起来
if (!isset($_SERVER['SCRIPT_URL']))
{
$tmp_uri = explode('?', $_SERVER['REQUEST_URI'] ,2);
$_SERVER['SCRIPT_URL'] = $tmp_uri[0];
}
# 处理BASE_URL
if (isset(self::$core_config['root_path']) && self::$core_config['root_path'])
{
self::$base_url = rtrim(self::$core_config['root_path'], '/');
}
else if (null === self::$base_url && isset($_SERVER["SCRIPT_NAME"]) && $_SERVER["SCRIPT_NAME"])
{
$base_url_len = strrpos($_SERVER["SCRIPT_NAME"], '/');
if (false!==$base_url_len)
{
$base_url_len += 1;
# 截取到最后一个/的位置
$base_url = substr($_SERVER["SCRIPT_NAME"], 0, $base_url_len);
if (preg_match('#^(.*)/wwwroot/$#', $base_url, $m))
{
# 特殊处理wwwroot目录
$base_url = $m[1] . '/';
$base_url_len = strlen($base_url);
}
if (strtolower(substr($_SERVER['REQUEST_URI'], 0, $base_url_len)) == strtolower($base_url))
{
self::$base_url = $base_url;
}
}
}
# 当没有$_SERVER["SCRIPT_URI"] 时拼接起来
if (!isset($_SERVER['SCRIPT_URI']))
{
$_SERVER['SCRIPT_URI'] = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS']=='on'?'https':'http').'://'.$_SERVER['HTTP_HOST'].$_SERVER['SCRIPT_URL'];
}
if (isset($_SERVER['PATH_INFO']))
{
if (substr($_SERVER['PATH_INFO'], 0 , 9) === '/wwwroot/')
{
$pathinfo = substr($_SERVER['PATH_INFO'], 8);
}
else
{
$pathinfo = $_SERVER['PATH_INFO'];
}
}
else
{
if (isset($_SERVER['REQUEST_URI']))
{
$request_uri = str_replace('\\', '/', $_SERVER['REQUEST_URI']);
$root_uri = '/'. ltrim(str_replace('\\', '/', substr($_SERVER['SCRIPT_FILENAME'], strlen($_SERVER['DOCUMENT_ROOT']))), '/');
$index_file = 'index'. EXT;
if (substr($root_uri, -strlen($index_file))==$index_file)
{
$root_uri = substr($root_uri, 0, -strlen($index_file));
}
if ($root_uri && $root_uri!='/')
{
$request_uri = substr($request_uri, strlen($root_uri));
}
list($pathinfo) = explode('?', $request_uri, 2);
$pathinfo = '/'. ltrim($pathinfo, '/');
}
elseif (isset($_SERVER['PHP_SELF']))
{
$pathinfo = $_SERVER['PHP_SELF'];
}
elseif (isset($_SERVER['REDIRECT_URL']))
{
$pathinfo = $_SERVER['REDIRECT_URL'];
}
else
{
$pathinfo = false;
}
}
# 过滤pathinfo传入进来的服务器默认页
if (false !== $pathinfo && ($indexpagelen = strlen(self::$core_config['server_index_page'])) && substr($pathinfo, -1 - $indexpagelen) == '/' . self::$core_config['server_index_page'])
{
$pathinfo = substr($pathinfo, 0, -$indexpagelen);
}
$pathinfo = trim($pathinfo);
if (!isset($_SERVER["PATH_INFO"]))
{
$_SERVER["PATH_INFO"] = $pathinfo;
}
self::$path_info = $pathinfo;
# 处理项目
foreach (self::$core_config['projects'] as $project => $item)
{
if (!preg_match('#^[a-z0-9_]+$#i', $project)) continue;
$rest_url = array();
$admin_url = array();
if (isset($item['dir']) && $item['dir'])
{
$project_dir = $item['dir'];
}
else
{
$project_dir = $project;
}
if (isset($item['url_rest']) && $item['url_rest'])
{
foreach ((array)$item['url_rest'] as $tmp_url)
{
if (preg_match('#^http(s)?\://#i', $tmp_url))
{
if (($url_path_info = self::_get_pathinfo($tmp_url)) !== false)
{
self::$project = $project;
self::$project_dir = $project_dir;
self::$path_info = $url_path_info;
self::$base_url = $tmp_url;
$request_mode = 'rest';
break 2;
}
}
else
{
# /开头的后台URL
$rest_url[] = $tmp_url;
}
}
}
if (isset($item['url_admin']) && $item['url_admin'])
{
foreach ((array)$item['url_admin'] as $tmp_url)
{
if (preg_match('#^http(s)?\://#i', $tmp_url))
{
if (($url_path_info = self::_get_pathinfo($tmp_url)) !== false)
{
self::$project = $project;
self::$project_dir = $project_dir;
self::$path_info = $url_path_info;
self::$base_url = $tmp_url;
$request_mode = 'admin';
break 2;
}
}
else
{
# /开头的后台URL
$admin_url[] = $tmp_url;
}
}
}
if ($item['url'])
{
foreach ((array)$item['url'] as $url)
{
if (($path_info = self::_get_pathinfo($url)) !== false)
{
self::$project = $project;
self::$project_dir = $project_dir;
self::$path_info = $path_info;
self::$base_url = $url;
if ($rest_url)foreach ($rest_url as $tmp_url)
{
# 处理后台URL不是 http:// 或 https:// 开头的形式
if (($url_path_info = self::_get_pathinfo($tmp_url)) !== false)
{
self::$path_info = $url_path_info;
self::$base_url .= ltrim($tmp_url, '/');
$request_mode = 'rest';
break 3;
}
}
if ($admin_url)foreach ($admin_url as $tmp_url)
{
# 处理后台URL不是 http:// 或 https:// 开头的形式
if (($url_path_info = self::_get_pathinfo($tmp_url)) !== false)
{
self::$path_info = $url_path_info;
self::$base_url .= ltrim($tmp_url, '/');
$request_mode = 'admin';
break 3;
}
}
break 2;
}
}
}
}
}