关于php代码的一些兼容
2018-01-31 16:33:52 / 3339 / 生活琐事提升代码的兼容性
使用$_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
很明显,这不是我们想要的结果,因为我们一般都是通过它来获取当前的文件地址
解决办法如下:
<?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']