应该有很多项目中会有这样的情况,通过 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

[转载]CodeIgniter配置之URL的更多相关文章

  1. proxy_pass反向代理配置中url后面加不加/的说明

    在日常的web网站部署中,经常会用到nginx的proxy_pass反向代理,有一个配置需要弄清楚:配置proxy_pass时,当在后面的url加上了/,相当于是绝对根路径,则nginx不会把loca ...

  2. (已解决)#warning:尚未配置[微信]URL Scheme:wx4868b35061f87884, 无法使用进行授权。

    #warning:尚未配置[微信]URL Scheme:wx4868b35061f87884, 无法使用进行授权. (说白了就是注册白名单) ” -canOpenURL: failed for URL ...

  3. nginx 配置支持URL HTML5 History 模式 与 设置代理

    拾人牙慧:https://segmentfault.com/q/1010000007140360 nginx 配置支持URL HTML5 History 模式 location / { try_fil ...

  4. nginx 配置web 虚拟文件夹 而且codeIgniter,thinkphp 重定向url 地址

    nginx 配置虚拟文件夹而且url 重定向 server { #侦听80port listen 8090; #定义使用www.xx.com訪问 server_name 127.0.0.1; #设定本 ...

  5. CodeIgniter配置之config

    配置说明 $config['language']:指定项目语言包.需要注意的时Codeigniter自带的类库错误提示语言包位于/system/language/english/目录下,当这里配置非e ...

  6. CodeIgniter配置之SESSION

    刚使用Codeigniter时也被其中的SESSION迷惑过,后来就再也没用过CI自带的SESSION,想必还是有必要整理一下SESSION.为弄清CI中的SESSION,先来说一下PHP中SESSI ...

  7. 【转】CodeIgniter配置之database

    CodeIgniter的数据库配置文件位于application/config/database.php, 该文件中定义了$db的二维数组,参考文件如下: 1 2 3 4 5 6 7 8 9 10 1 ...

  8. wordpress 在linux上配置固定url方法

    wordpress 设置固定url总结 相信好多用wordpress的网友为了提升wordpress对搜索引擎的友好,或者是为了写的博客地址更好记,都会在wordpress的后台设置固定url的方式. ...

  9. [转载]ASP.NET MVC URL重写与优化(进阶篇)-继承RouteBase玩转URL

    引言-- 在初级篇中,我们介绍了如何利用基于ASP.NET MVC的Web程序中的Global文件来简单的重写路由.也介绍了它本身的局限性-依赖于路由信息中的键值对: 如果键值对中没有的值,我们无法将 ...

随机推荐

  1. linux 搭建apache 服务器

    1.查看apache服务器 /etc/init.d/httpd status 若没有,则使用yum  -y install httpd  安装软件 2.设置开机启动 chkconfig httpd o ...

  2. 【11】把 GitHub 当 CMS 用

    把 GitHub 当 CMS 用 你的网站需要显示一些文字,但是你还不想直接放在 HTML 里面,那你可以把 GitHub 作为你储存内容的一个地方. 这样,就可以让任何一个非程序员通过修改 Mark ...

  3. oracle11gR2下scott用户以及表的建立

    目录 oracle11gR2下scott用户以及表的建立 找到系统带的sql文件(utlsample.sql) 根据SQL的内容操作 新建用户并授权 scott登录 表操作 查询表(使用pl/sql) ...

  4. Visual Studio 2013 中使用断点

    你可能已经很熟悉Visual Studio中的断点的基本功能.你在编辑器里代码的侧边点击,创建一个红色的圆点,然后运行应用程序,线程走到你所点的代码处停下,你可以用调试窗口查看代码状态. 你可能不熟悉 ...

  5. Python基础数据类型之集合

    Python基础数据类型之集合 集合(set)是Python基本数据类型之一,它具有天生的去重能力,即集合中的元素不能重复.集合也是无序的,且集合中的元素必须是不可变类型. 一.如何创建一个集合 #1 ...

  6. Leetcode 402.移掉k位数字

    移调k位数字 给定一个以字符串表示的非负整数 num,移除这个数中的 k 位数字,使得剩下的数字最小. 注意: num 的长度小于 10002 且 ≥ k. num 不会包含任何前导零. 示例 1 : ...

  7. ubuntu上传项目到github

    https://blog.csdn.net/ajianyingxiaoqinghan/article/details/70544159

  8. 九度oj 题目1012:畅通工程

    题目描述: 某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇.省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要互相间接通过道路 ...

  9. BZOJ 1443 [JSOI2009]游戏Game ——博弈论

    好题. 首先看到棋盘,先黑白染色. 然后就是二分图的经典模型. 考虑最特殊的情况,完美匹配,那么先手必胜, 因为无论如何,先手走匹配边,后手无论走哪条边,总有对应的匹配边. 如果在不在最大匹配中出发, ...

  10. android开发里遇到的坑——eclipse项目导入android studio以后Run按钮灰色

    android studio编译有错误但是没有提示给用户,关闭android studio重新启动项目后,会显示错误,修复以后即可!