用户注册



邮箱:

密码:

用户登录


邮箱:

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

发表随想


还能输入: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、请勿发布广告信息或其他无关评论,否则将会删除评论并扣分,严重者给予封号处理。


扫码下载

加载中,请稍后...

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

加载中,请稍后...