纯php代码实现伪静态的方法

我们知道,配置伪静态,我们可以使用.htaccess这个文件来配置,当然要打开相应扩展,但是,有的时候我们是不能进行这些配置的,或者有的时候这样的配置并不方便,而且非常的不灵活,今天就总结一个用纯php代码来实现伪静态的方式。因为我近期想自己封装一个框架,参考了thinkphp等的伪静态实现方式,我们之前用的这个的框架其实非常好用,不过就是没有伪静态,于是我就打算加上这个伪静态功能。
要学习伪静态,首先我们要懂得url的访问规则,举个例子,如果我们访问http://local.nyyl.com/index.php/login/index,我们可以看到路径中有个index.php,其实就是有.这个符号,那么他访问的时候就是访问根目录下的index.php这个文件,后面的参数,如果没有配置伪静态,其实就没有意义,而如果我们访问http://local.nyyl.com/login/index,这样是比较规范的路径,那么他会先试图访问login这个目录,因为从表面上看,他应该是个目录形式,如果可以找到login这个目录,那么他就会再从里面找index这个目录,如果能找到,就访问里面的index.html或者index.htm或者index.php等,如果没有这样的文件,就会显示404,而如果我们在login下面配置了伪静态(要知道,伪静态是相对目录层级而言的,每个配置都是针对某个目录下起作用的),那么首先他还是按照上面说的方式找,而不同的是,如果他没有找到这个index目录,那么伪静态就会起作用,将这个index变为伪静态配置中所配置的参数。也就是说,伪静态的优先级是低于目录结构本身的,所以,我们配置伪静态的时候一定要考虑到目录名称,尽量要将伪静态的规则和目录名进行区别开,防止受目录本身结构的影响。下面就说一下我的这个php代码实现伪静态的方法,我们在网站根目录进行配置,并且以我的框架为例来说。
首先,这个框架和其他框架一样,所用的url访问,都是访问的一个类库中的某个方法,都是通过实例化某个类库的方法实现的,所以我们定义了一个m和一个a参数,来分别接收类名和方法名。然后通过new进行实例化,而我们要做伪静态当然我们要定义一下规则,我定义的规则就是,将路径中第一个参数付给$_GET[‘m’],将第二个参数付给$_GET[‘a’],然后后面的参数成对出现的付给$_GET的key和value,这样来达到虚拟接收get传值的方式,很多人对get传值可能并不理解,因为程序本身可以自动将?后接收的类似m=login值就会默认的付给$_GET,变成$_GET[‘m’]=login这样,其实我们完全可以通过一些函数,获取一下url信息,进制自己组合$_GET;这个函数就是$_SERVER来看一下我的代码实现

define(‘URLROLE’, 1);定义url规则,1为伪静态,即http://local.nyyl.com/login/index这样;这里是可以省略index.php的

if(1==URLROLE){
$nav=$_SERVER["REQUEST_URI"];
$script_name=$_SERVER["SCRIPT_NAME"];
$nav1=ereg_replace(".html","",substr(ereg_replace("$script_name","",urldecode($nav)),1));
$vars = @explode("/",$nav1);
$_url = array_chunk($vars,2);
$_GET['m'] = $vars[0]?$vars[0]:'index';//如果没有参数,默认访问index类库的index方法
$_GET['a'] = $vars[1]?$vars[1]:'index';
unset($_url[0]);
if($_url){
foreach($_url as $key=>$val){
@$_GET[$val[0]] = $val[1];
}
}
//var_dump($_GET);
}

如果我们访问http://local.nyyl.com/login/index/name/zhang
就会输出:array(3) { [“m”]=> string(5) “index” [“a”]=> string(5) “index” [“name”]=> string(5) “zhang” }
这个代码是是根据我的框架要求来的,所以,如果大家要做,肯定根据需要进行修改一下即可。

打赏此文

如果您觉得本站的内容对您有所帮助,您可以扫描下面的二维码小额支付请我喝杯茶,感谢!打赏记录
支付宝
微信
承诺:凡打赏捐助的朋友,留言备注自己的邮箱,在打赏捐助时间点的6个月内,本站会每周邮件推送原创专业技术博文,供大家学习和参考!

4 条评论

  1. 南柯一梦说道:

    楼主对技术理解透彻,非常佩服!

  2. NY说道:

    thinkphp的框架?

留下评论

All fields marked (*) are required