php中$_SERVER[PATH_INFO]变量使用详解

三月 06, 2019 | views
Comments 0

如果你希望你的php可以使用$_SERVER[PATH_INFO]我们需要让Apache支持pathinfo才可以了,当然大部份apache默认就是支持pathinfo的哦.

最后总结测试环境:

  1. Ubuntu Server 14.04 
  2. PHP Version 5.5.9-1ubuntu4 
  3. 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,内容为:

<?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,内容为:

  1. <?php 
  2. namespace HomeController; 
  3. use ThinkController; 
  4. class IndexController extends Controller { 
  5.     public function index(){ 
  6.         $this->show('Hi,All','utf-8'); 
  7.     } //开源软件:phpfensi.com 
  8.     public function test(){ 
  9.         $this->show('test'); 
  10.     } 
  11. }?> 

当访问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模式支持,在配置文件中加入:

  1. <Files *.php> 
  2. AcceptPathInfo On 
  3. </Files> 

这样 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模式访问了.



zend