<?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 , '/' )); |
} |
?> |