【ci框架】源码解读:URI.php中_fetch_uri_string()函数的解析

APPPATH/config/config.php中对于url 格式的拟定。 
$config['uri_protocol']    = 'AUTO';

这个配置项目定义了你使用哪个服务器全局变量来拟定URL。 
默认的设置是auto,会把下列四个方式轮询一遍。当你的链接不能工作的时候,试着用用auto外的选项。

'AUTO'            Default - auto detects 
'PATH_INFO'        Uses the PATH_INFO 
'QUERY_STRING'            Uses the QUERY_STRING 
'REQUEST_URI'        Uses the REQUEST_URI 
'ORIG_PATH_INFO'    Uses the ORIG_PATH_INFO 
  
CI_URI中的几个成员变量 

?
1
2
3
4
$keyval  = array ();            //List of cached uri segments
$uri_string ;                      //Current uri string
$segments                       //List of uri segments
$rsegments  = array ()       //Re-indexed list of uri segments

 

获取到的current uri string 赋值到 $uri_string ,通过function _set_uri_string($str)。

 

获取到$str有几个选项,也就是_fetch_uri_string()的业务流程部分了

一、默认$config['uri_protocol'] = 'AUTO'时,程序会一次轮询下列方式来获取URI

(1)当程序在CLI下运行时,也就是在命令行下php文件时候。ci会这么获取URI 
    

?
1
2
3
4
5
private  function  _parse_cli_args()
         {
             $args  = array_slice ( $_SERVER [ 'argv' ], 1);
             return  $args  ? '/'  . implode( '/' , $args ) : '' ;
         }

   //$_SERVER['argv'] 包含了传递给脚本的参数 当脚本运行在CLI时候,会给出c格式的命令行参数 
   截取到$_SERVER['argv']中除了第一个之外的所有参数 
   

如果你在命令行中这么操作

?
1
php d:\wamp\www\CodeIgniter\index.php\start\index

    _parse_cli_args() 返回一个 /index.php/start/index的字符串

  (2)默认使用REQUEST_URI来探测url时候会调用 私有函数  _detect_uri()

   (3)如果上面的两种方式都不能获取到uri那么会采用$_SERVER[‘PATH_INFO’]来获取

?
1
2
3
4
5
6
$path  = (isset( $_SERVER [ 'PATH_INFO' ])) ? $_SERVER [ 'PATH_INFO' ] : @ getenv ( 'PATH_INFO' );
             if  (trim( $path , '/' ) != ''  && $path  != "/" .SELF)
             {
                 $this ->_set_uri_string( $path );
                 return ;
             }
?
1
(4)如果上面三种方式都不能获取到,那么就使用 $_SERVER [‘QUERY_STRING’]或者 getenv [‘QUERY_STRING’]
?
1
2
3
4
5
6
7
$path  =  (isset( $_SERVER [ 'QUERY_STRING' ])) ? $_SERVER [ 'QUERY_STRING' ] : @ getenv ( 'QUERY_STRING' );
             if  (trim( $path , '/' ) != '' )
             {
                 $this ->_set_uri_string( $path );
                 return ;
             }
   (5)上面四种方法都不能获取到URI,那么就要使用 $_GET 数组了,没招了
?
1
2
3
4
5
if  ( is_array ( $_GET ) && count ( $_GET ) == 1 && trim(key( $_GET ), '/' ) != '' )
             {
                 $this ->_set_uri_string(key( $_GET ));
                 return ;
             }
?
1
二、在config.php中设定了 $config [ 'uri_protocol' ] ,那么 程序会自动执行相应的操作来获取uri
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值