用户注册



邮箱:

密码:

用户登录


邮箱:

密码:
记住登录一个月忘记密码?

发表随想


还能输入:200字
云代码 - php代码库

CodeIgniter URI.php 类源码解读

2014-12-04 作者: php源代码大全举报

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


网友评论    (发表评论)


发表评论:

评论须知:

  • 1、评论每次加2分,每天上限为30;
  • 2、请文明用语,共同创建干净的技术交流环境;
  • 3、若被发现提交非法信息,评论将会被删除,并且给予扣分处理,严重者给予封号处理;
  • 4、请勿发布广告信息或其他无关评论,否则将会删除评论并扣分,严重者给予封号处理。


扫码下载

加载中,请稍后...

输入口令后可复制整站源码

加载中,请稍后...