[php]代码库
<?php
/**
* Detects the URI
*
* This function will detect the URI automatically and fix the query string
* if necessary.
*
* @access private
* @return string
*/
private function _detect_uri()
{
//如果这两个值缺少其中一个,那么这种方法行不通
if ( ! isset($_SERVER['REQUEST_URI']) OR ! isset($_SERVER['SCRIPT_NAME']))
{
return '';
}
//取得request_uri
$uri = $_SERVER['REQUEST_URI'];
//注意下面这个是===0不是false! 接下来这个if和下面的elseif分别是script_name有文件名和没有文件名(如
//http://abc.com/CI/或者http://abc.com/CI/?c=index&m=welcome等)的不同情况的处理。
if (strpos($uri, $_SERVER['SCRIPT_NAME']) === 0)
{
//去掉共同部分,取得对路由有用的部分。
$uri = substr($uri, strlen($_SERVER['SCRIPT_NAME']));
}
elseif (strpos($uri, dirname($_SERVER['SCRIPT_NAME'])) === 0)
{
//作用同上
$uri = substr($uri, strlen(dirname($_SERVER['SCRIPT_NAME'])));
}
// This section ensures that even on servers that require the URI to be in the query string (Nginx) a correct
// URI is found, and also fixes the QUERY_STRING server var and $_GET array.
//这里是为兼容?/abc/xx/的形式。
if (strncmp($uri, '?/', 2) === 0)
{
$uri = substr($uri, 2);
}
//在这里$uri可能是?xxx=xx的形式,也可能是直接xxx=xx,也可能是/
$parts = preg_split('#\?#i', $uri, 2);
$uri = $parts[0];
//如果是能通过上述的正则分割出两段,那么,是通过query_string即?的形式进行路由访问
if (isset($parts[1]))
{
$_SERVER['QUERY_STRING'] = $parts[1];
parse_str($_SERVER['QUERY_STRING'], $_GET);
}
else
{
$_SERVER['QUERY_STRING'] = '';
$_GET = array();
}
//如果为/,或者为空,有两种情况,要么就是通过query_string,所以此时$parts[0]就是等于下面两种可能,同时我们
//已经通过$parts[1]拿到要拿的信息,则可以返回。要么就是以段的形式,但是段的信息为空,即直接访问入口文件而没有
//任何路由信息的传递,也可以直接返回。
if ($uri == '/' || empty($uri))
{
return '/';
}
//这里我个人觉得是上面的strpos($uri, $_SERVER['SCRIPT_NAME']) === 0和elseif都无法匹配的时候,
//返回这个url的path部分。
$uri = parse_url($uri, PHP_URL_PATH);
// Do some final cleaning of the URI and return it
return str_replace(array('//', '../'), '/', trim($uri, '/'));
}
?>