Hex 发表于 2013-5-19 11:33:34

优雅de凋零 发表于 2013-5-19 00:06 static/image/common/back.gif
终于找到了啊.................
URI类中的 _fetch_uri_string()方法
里面有这样一句 if($uri = $this->_det ...

这要具体问题具体分析了,正常情况都不会为 false 的。

疯子 发表于 2013-7-4 18:49:48

好帖,收藏了

似月光 发表于 2013-8-11 00:20:14

我顶 对不起来这一遭

phper08 发表于 2013-9-7 22:30:24

get_config()获取config.php里的所有配置信息,config_item()获取某一条配置信息,放在common.php里是为了更方便,config_item()依赖于get_config()

CI_Config类还能获取到config目录下的xx.php,在构造函数里也使用到了get_config()函数

phper08 发表于 2013-9-7 22:48:21

写得不错,不过看着累,看源码更轻松些,毕竟CI的源码比较简单,建议先自己看源码后再来看教程

Lin17 发表于 2013-9-8 11:27:46

Hex 发表于 2009-8-22 01:33 static/image/common/back.gif
(接楼上)

      Router类与HTTP请求解析


有个问题要请教下大神。{:soso_e100:}
我用的是最新版本的ci
function _fetch_uri_string()
    {
      if (strtoupper($this->config->item('uri_protocol')) == 'AUTO')
      {
            // Is the request coming from the command line?
            if (php_sapi_name() == 'cli' or defined('STDIN'))
            {
                $this->_set_uri_string($this->_parse_cli_args());
                return;
            }

            // Let's try the REQUEST_URI first, this will work in most situations
            if ($uri = $this->_detect_uri())
            {
                $this->_set_uri_string($uri);
                return;
            }

            // Is there a PATH_INFO variable?
            // Note: some servers seem to have trouble with getenv() so we'll test it two ways
            $path = (isset($_SERVER['PATH_INFO'])) ? $_SERVER['PATH_INFO'] : @getenv('PATH_INFO');
            if (trim($path, '/') != '' && $path != "/".SELF)
            {
                $this->_set_uri_string($path);
                return;
            }

            // No PATH_INFO?... What about QUERY_STRING?
            $path =(isset($_SERVER['QUERY_STRING'])) ? $_SERVER['QUERY_STRING'] : @getenv('QUERY_STRING');
            if (trim($path, '/') != '')
            {
                $this->_set_uri_string($path);
                return;
            }

            // As a last ditch effort lets try using the $_GET array
            if (is_array($_GET) && count($_GET) == 1 && trim(key($_GET), '/') != '')
            {
                $this->_set_uri_string(key($_GET));
                return;
            }

            // We've exhausted all our options...
            $this->uri_string = '';
            return;
      }

      $uri = strtoupper($this->config->item('uri_protocol'));

      if ($uri == 'REQUEST_URI')
      {
            $this->_set_uri_string($this->_detect_uri());
            return;
      }
      elseif ($uri == 'CLI')
      {
            $this->_set_uri_string($this->_parse_cli_args());
            return;
      }

      $path = (isset($_SERVER[$uri])) ? $_SERVER[$uri] : @getenv($uri);
      $this->_set_uri_string($path);
    }
看到pathinfo的优先级在第二位了,第一优先是取REQUEST_URI,SCRIPT_NAME,
没有优选pathinfo,于是我有这个想法,在nginx的配置是不是可以不配置pathinfo,结果ci不能正常运行
最后发现,没有配置pathinfo
$_SERVER:
=> /ci/index.php/comments/add_comments => /ci/index.php/comments/add_comments

配置pathinfo:
=> /ci/index.php
=> /ci/index.php/comments/add_comments

而通过CI源代码( URI._detect_uri() )发现
$uri = substr($uri, strlen($_SERVER['SCRIPT_NAME']));
解析出uri的关键就是根据这两个参数,究竟pathinfo和SCRIPT_NAME有什么关系,这是个让我百思不得其解的问题,网上没查到,so问问大神。。。
我的环境 ubuntu + php5.4.19+nginx/1.5.1

away410 发表于 2013-12-14 16:59:42

mark

zhoujing 发表于 2013-12-17 15:53:52

mark。。。

Hex 发表于 2013-12-17 20:00:39

Lin17 发表于 2013-9-8 11:27 static/image/common/back.gif
有个问题要请教下大神。
我用的是最新版本的ci
function _fetch_uri_string()


其实很简单,支持 PATH_INFO 的话就不会把整个 URI 都当作文件名。
这里只是个环境变量而已,没有什么特殊的。

站在未来看现在 发表于 2014-1-6 10:59:22

收藏下
页: 1 2 3 [4] 5
查看完整版本: CodeIgniter 源代码解析