纯php的伪静态怎么写,纯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的

php纯代码实现伪静态

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);

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

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($_urlas$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” }

这个代码是是根据我的框架要求来的,所以,如果大家要做,肯定根据需要进行修改一下即可。

程序本天成,妙手偶得之!我们只是代码的搬运工!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值