下面是一组测试数据,为了看看在哪些环境下 这些地址变量得到的是什么值
测试代码如下
echo 'get:';
print_r($_GET);
echo "<br />";
echo '$_SERVER[\'PATH_INFO\']:'.$_SERVER['PATH_INFO'].'<br />';
echo '$_SERVER[\'QUERY_STRING\']:'.$_SERVER['QUERY_STRING'].'<br />';
echo '$_SERVER[\'SCRIPT_NAME\']:'.$_SERVER['SCRIPT_NAME'].'<br />';
echo '$_SERVER[\'ORIG_PATH_INFO\']:'.$_SERVER['ORIG_PATH_INFO'].'<br />';
echo '$_SERVER[\'REQUEST_URI\']:'.$_SERVER['REQUEST_URI'].'<br />';
1:apache模块模式下
A:访问如下地址http://localhost/test/index.php/a/b/test.html?b=2&c=1
得到的输出为:
get:Array ( [b] => 2 [c] => 1 )
$_SERVER['PATH_INFO']:/a/b/test.html
$_SERVER['QUERY_STRING']:b=2&c=1
$_SERVER['SCRIPT_NAME']:/test/index.php
$_SERVER['ORIG_PATH_INFO']:
$_SERVER['REQUEST_URI']:/test/index.php/a/b/test.html?b=2&c=1
B:开启rewrite模块省略掉index.php后 访问 http://localhost/test/a/b/test.html?b=2&c=1
得到的输出为:
get:Array ( [b] => 2 [c] => 1 )
$_SERVER['PATH_INFO']:
$_SERVER['QUERY_STRING']:b=2&c=1
$_SERVER['SCRIPT_NAME']:/index.php
$_SERVER['ORIG_PATH_INFO']:
$_SERVER['REQUEST_URI']:/test/a/b/test.html?b=2&c=1
2:在apache cgi模式下
A:访问如下地址http://localhost/test/index.php/a/b/test.html?b=2&c=1
得到了一个错误提示”No input file specified”
据说这个cgi模式下只要在文件名后加斜杠 都不行
B:开启rewrite模块省略掉index.php后 访问 http://localhost/test/a/b/test.html?b=2&c=1
得到如下输出
get:Array ( [b] => 2 [c] => 1 )
$_SERVER['PATH_INFO']:
$_SERVER['QUERY_STRING']:b=2&c=1
$_SERVER['SCRIPT_NAME']:/index.php
$_SERVER['ORIG_PATH_INFO']:
$_SERVER['REQUEST_URI']:/test/a/b/test.html?b=2&c=1
结果与在apache模块模式下 一样。
看样子还是REQUEST_URI最可靠。但是为什么CI框架要使用’PATH_INFO’呢?
而wordpress的URL路由使用的就是REQUEST_URI.当然CI框架中也可以使用REQUEST_URI模式,只不过要另外配置。
CI给出的解释是
Due to the way REQUEST_URI works it usually contains path info that makes it unusable as URI data.
翻译过来就是:
由于REQUEST_URI工作方式通常包含路径信息,使得它无法当做一个有用的URI数据来使用。
也就是说如果在二级目录test下 我们使用REQUEST_URI来获取后面的URI数据的话 会连同test一起 获取到,这样的话就不会像path_info那样 只得到执行文件名后面那些数据了。
