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