关于php代码的一些兼容

提升代码的兼容性

    使用$_SERVER['DOCUMENT_ROOT'],有时候不能获取到自己想要的目录,比如在wamp里设置apache的别名访问,获取到的依然是设置的根目录,而非当前别名的根目录,这样在判断一些操作的时候,就会出现问题


       Alias /base/ "/var/www/html/centos7/base_centos7/"
       Alias /epel/ "/var/www/html/epel7/epel7/"
       Alias /updates/ "/var/www/html/centos7/updates_centos7/"
       Alias /extras/ "/var/www/html/centos7/extras_centos7/"

    解决办法:

    //开启别名的情况下,对根目录的重写,不然为默认的根目录

    $sdroot = dirname($_SERVER['SCRIPT_FILENAME']).'/';

    //取得当前访问的物理目录

    $droot = substr($_SERVER['PHP_SELF'],0,strrpos($_SERVER['PHP_SELF'],'/')+1);

    //取得访问的根目录

    $_SERVER['DOCUMENT_ROOT'] = str_replace($droot,'',$sdroot).'/';

      关于$_SERVER['PHP_SELF']的问题
      使用$_SERVER['PHP_SELF']的时候,如果用户开启了pathinfo模式,那么访问的结果就会加上后面的值,举个例子
      访问

      index.php

      <?php echo $_SERVER['PHP_SELF']; ?>

      访问 127.0.0.1/new/index.php

      127.0.0.1/new/index.php

      访问127.0.0.1/new/index.php/111/222

      127.0.0.1/new/index.php/111/222

      很明显,这不是我们想要的结果,因为我们一般都是通过它来获取当前的文件地址

      解决办法如下:

      <?phpif(isset($_SERVER['PATH_INFO'])){
         $phpfile = basename($_SERVER['SCRIPT_FILENAME']);//取得当前访问文件的物理路径
         $_SERVER['PHP_SELF'] = substr($_SERVER['PHP_SELF'], 0, strpos($_SERVER['PHP_SELF'], $phpfile)).$phpfile;
      }?>

      此段代码根据当前的访问模式是不是pathinfo,重写了$_SERVER['PHP_SELF'] 来适应pathinfo情况下多余的返回值

      ps: 还有个更好的解决方案,使用$_SERVER['SCRIPT_NAME']来替代$_SERVER['PHP_SELF']


      分享
      gravatar头像