关于php代码的一些兼容

lovefc   ·  10月前   ·   后端语言

提升代码的兼容性

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

    <IfModule alias_module>
        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/"
    </IfModule>

    解决办法:

    //开启别名的情况下,对根目录的重写,不然为默认的根目录
    $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

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

      解决办法如下:

      <?php
         if(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']

      0 条回复   |  直到 10月前 | 295 次浏览
      登录后才可发表内容