zoukankan      html  css  js  c++  java
  • [转载]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

  • 相关阅读:
    【JDK】:java.lang.Integer源码解析
    使用truelicense实现用于JAVA工程license机制(包括license生成和验证)
    Android Button.getWidth()为0的问题
    nacos启动报错nacos Unable to start web server;
    Oracle字符集相关学习笔记记录
    Oracle触发器简单使用记录
    Oracle分析函数、窗口函数简单记录汇总
    Oracle远程数据建物化视图(materialized)创建简单记录,以及DBLINK的创建
    Oracle 行列转换函数pivot、unpivot的使用(二)
    Oracle递归查询(start with…connect by prior)
  • 原文地址:https://www.cnblogs.com/zhutianpeng/p/4222313.html
Copyright © 2011-2022 走看看