[转载]CodeIgniter配置之URL

  应该有很多项目中会有这样的情况,通过 http://pc.local 可以访问,若通过 http://localhost/pc/public 则会出现一些图片、样式显示不到,超链接出错的情况,项目的移植性不太好,主要原因就是创建的URL不够灵活,接下来看看CI中是怎么处理。

  配置文件中有几个有关URL的配置,影响到路由、参数的获取和URL的创建,它们是:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$config [ 'base_url' ] = '' ;
 
$config [ 'index_page' ] = 'index.php' ;
 
$config [ 'uri_protocol' ] = 'AUTO' ;
 
$config [ 'url_suffix' ] = '' ;
 
$config [ 'allow_get_array' ]      = TRUE;
 
$config [ 'enable_query_strings' ] = FALSE;
 
$config [ 'controller_trigger' ]   = 'c' ;
 
$config [ 'function_trigger' ]     = 'm' ;
 
$config [ 'directory_trigger' ]    = 'd' ;

$config['uri_protocol']

  uri_protocol可选项有AUTO、PATH_INFO、QUERY_STRING、REQUEST_URI、ORIG_PATH_INFO

  含义分别如下:
  QUERY_STRING:查询字符串;
  PATH_INFO:客户端提供的路径信息,即在实际执行脚本后面尾随的内容,会去掉Query String;
  REQUEST_URI:包含HTTP协议中定义的URI内容。
  访问:http://pc.local/index.php/product/pc/summary?a=1时
  PATH_INFO为/product/pc/summary;REQUEST_URI为/index.php/product/pc/summary?a=1;QUERY_STRING为a=1
  实际的配置跟服务器配置也会有点关系,有的服务器会配置ORIG_PATH_INFO,大部分没有。

  uri_protocol的值决定了CI路由和参数的获取方式,CI会通过这些值来判断解析到哪一个控制器,所以需要确保服务器配置了正确的值。大部分情况下设置AUTO即可,AUTO会依次检测REQUEST_URI PATH_INFO QUERY_STRING $_GET的值,直到读到内容。

  影响路由解析还有enable_query_strings参数,当该参数为TRUE时, 并且传入了controller_trigger参数,则会以查询字符串的方式来获取参数,如index.php?c=products&m=view&id=345则解析到product控制器中的view方法。

$config['allow_get_array']
  CI中封装了$this->input->get()方法来获取get参数,这里设置为true则表示也允许通过$_GET方式来获取参数,否则会清空$_GET中的值。

$config['base_url']
  该参数的设置会影响到base_url() site_url()函数创建的URL,为空时程序会自动获取当前地址,否则会根据设置的地址进行创建URL。
$config['index_page'] 默认主页,使用site_url()创建时会带上该参数,若需要去掉index.php设置为空即可。
$config['url_suffix'] 后缀名, 使用site_url()创建时也会带上该参数。
  以上两个参数的设置对base_url()无效,即不会追加 index_page 和 url_suffix的值。

1
2
3
4
5
//pc.local/bootstrap/js/bootstrap.min.js
echo base_url( 'bootstrap/js/bootstrap.min.js' );
 
//pc.local/login.htm(设置了index_page='' url_suffix='.htm')
echo site_url( 'login' );

所以可以发现,base_url() 用来创建静态资源的地址,如JS、CSS等地址需要用该函数来生成。site_url() 用来创建跟控制器地址相关的URL。

使用base_url()和site_url()函数创建的URL地址具有更好的移植性,建议系统URL相关的地址统一使用该函数创建。

  CI提供的site_url对于参数的处理还不够灵活,可以自己扩展一个create_url函数用来创建跟控制器相关的地址。下面为一种实现方式。

  扩展url_helper,在helpers中创建MY_url_helper.php,内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
function create_url( $route = NULL, $params = array (), $ampersand = '&' )
{
     $route = site_url( $route );
     if (! empty ( $params )) {
         return $route . '?' .http_build_str( $params , NULL, $ampersand );
     }
     return $route ;
}
if (! function_exists( 'http_build_str' ))
{
     function http_build_str( $query , $prefix = '' , $arg_separator = '' )
     {
         if (! is_array ( $query )) {
             return null;
         }
         if ( $arg_separator == '' ) {
             $arg_separator = ini_get ( 'arg_separator.output' );
         }
         $args = array ();
         foreach ( $query as $key => $val ) {
             $name = $prefix . $key ;
             if (! is_numeric ( $name )) {
                 if ( is_array ( $val )){
                     http_build_str_inner( $val , $name , $arg_separator , $args );
                 } else {
                     $args [] = rawurlencode( $name ). '=' .urlencode( $val );
                 }
             }
         }
         return implode( $arg_separator , $args );
     }
}
 
if (! function_exists( 'http_build_str_inner' ))
{
     function http_build_str_inner( $query , $prefix , $arg_separator , & $args )
     {
         if (! is_array ( $query )) {
             return null;
         }
         foreach ( $query as $key => $val ) {
             $name = $prefix . "[" . $key . "]" ;
             if (! is_numeric ( $name )) {
                 if ( is_array ( $val )){
                     http_build_str_inner( $val , $name , $arg_separator , $args );
                 } else {
                     $args [] = rawurlencode( $name ). '=' .urlencode( $val );
                 }
             }
         }
     }
}
 

--EOF--

转自 http://itopic.org/codeigniter-config-url.html

转载于:https://www.cnblogs.com/zhutianpeng/p/4222313.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值