最后总结测试环境:
Ubuntu Server 14.04
PHP Version 5.5.9-1ubuntu4
Apache/2.4.7 (Ubuntu)
PATH_INFO是服务器状态中的一个参数,通过$_SERVER['PATH_INFO']可以查看内容。$_SERVER数组中除了PATH_INFO外,还有非常多的数据,比如REQUEST_URI包含了更多的信息。
还有容易混淆的概念:pathinfo指的是PHP4(4.0.3)的一个功能,用于返回一个文件的路径信息。
Apache默认支持PATH_INFO功能,网上的很多教程不是需要修改apache的配置文件,就是要修改php的配置文件,其实完全不用修改任何文件,可以采用以下两种方式来验证PATH_INFO功能。
方式一:原生代码测试
在一个全新的系统上,比如新建一个Ubuntu 14.04 Server虚拟机,仅安装OpenSSH和LAMP软件包。
在Apache的主路径/var/www/html目录下新建测试文件pathinfo.php,内容为
echo $_SERVER['PATH_INFO'];
?>
假设虚拟机的IP是192.168.1.106,访问http://192.168.1.106/pathinfo.php,会得到一个空白的页面。因为这个URL没有包含PATH_INFO信息。
更换网址测试http://192.168.1.106/pathinfo.php/year/2014/,页面上会显示/year/2014/,说明可以识别PATH_INFO信息。
方法二:用ThinkPHP测试
很多的PHP框架都需要获取PATH_INFO的值,以ThinkPHP为例,基本的步骤是:
下载最新的ThinkPHP到/var/www/html/目录,并解压,修改文件的权限为www-data
访问网址http://192.168.1.106/index.php,会自动生成Application下的文件列表
编辑文件Application/Home/Controller/IndexController.class.php,内容为
namespace HomeController;
use ThinkController;
class IndexController extends Controller {
public function index(){
$this->show('Hi,All','utf-8');
}
public function test(){
$this->show('test');
}
}
当访问http://192.168.1.106/index.php的时候,本质上是访问了http://192.168.1.106/index.php/Home/Index/index,如果后面这个长的可以访问,说明PATH_INFO是正常的。
如果存在异常,ThinkPHP可以能报错为无法加载模块/控制器或非法操作,可以通过访问test方法来验证。
输入网址http://192.168.1.106/index.php/Home/Index/test测试,页面会正常显示test
补充:Apache2.2.22开启PathInfo模式支持
在配置文件中加入
AcceptPathInfo On
这样 Apache 就可以支持针对 php 文件的 PathInfo 了。
于是,小柒又充满希望的试了一下,可惜,还是没有成功。
我想,这PathInfo跟URL有关,那会不会是因为Apache服务器没有开启mod_rewrite模块的关系呢?于是,我在Apache的配置文件(Apache安装目录的conf文件夹下的httpd.conf文件)里找到:
#LoadModule rewrite_module modules/mod_rewrite.so
将前面的#去掉,改为:
LoadModule rewrite_module modules/mod_rewrite.so
保存,重启服务器后,项目终于可以使用PathInfo模式访问了