php url路由入门实例


Posted in PHP onApril 23, 2014

一、什么是php的路由机制

1、路由机制就是把某一个特定形式的URL结构中提炼出来系统对应的参数。举个例子,如:http://main.test.com/article/1  其中:/article/1  -> ?_m=article&id=1。

2、然后将拥有对应参数的URL转换成特定形式的URL结构,是上面的过程的逆向过程。

二、PHP的URL路由方式

总体来说就是:获取路径信息->处理路径信息

URL路由方式:

第一种是通过url参数进行映射的方式,一般是两个参数,分别代表控制器类和方法比如index.php?c=index&m=index映射到的是index控制器的index方法。

第二种,是通过url-rewrite的方式,这样的好处是可以实现对非php结尾的其他后缀进行映射,当然通过rewrite也可以实现第一种方式,不过纯使用rewrite的也比较常见,一般需要配置apache或者nginx的

rewrite规则 

<IfModule mod_rewrite.c>  
    RewriteEngine On  
    RewriteBase /  
    RewriteRule ^index\.php$ - [L]  
    RewriteCond %{REQUEST_FILENAME} !-f  
    RewriteCond %{REQUEST_FILENAME} !-d  
    RewriteRule . /index.php [L]  
</IfModule>

第三种,就是通过pathinfo的方式,所谓的pathinfo,就是形如这样的url。xxx.com/index.php/c/index/aa/cc,apache在处理这个url的时候会把index.php后面的部分输入到环境变量$_SERVER['PATH_INFO'],它等于/c/index/aa/cc。然后我们的路由器再通过解析这个串进行分析就可以了,后面的部分放入到参数什么地方的,就依据各个框架不同而不同了。

三、 一个简单的PHP路由实现

3.1 修改htaccess文件

编写服务器apache或IIS自带的rewrite文件,将URL结构导入指定文件比如:index.php。

开启rewrite:htaccess文件是Apache服务器中的一个配置文件,它负责相关目录下的网页配置。启用.htaccess,需要修改apache/conf/httpd.conf,启用AllowOverride,并可以用AllowOverride限制特定命令的使用。

<Directory />  
Options FollowSymLinks  
AllowOverride None  
</Directory> 

改为
<Directory />  
Options FollowSymLinks  
AllowOverride All  
</Directory> 

然后我写了这样的rewrite:

RewriteEngine on #rewriteengine为重写引擎开关on为开启off为关闭  
#RewriteCond $1 !^(index.php\.php|images|robots\.txt)  
RewriteRule ([a-zA-Z]{1,})-([0-9]{1,}).html$ sharexie/test.php?action=$1&id=$2 

#([a-zA-Z]{1,})-([0-9]{1,}).html$是规则,sharexie/test.php?action=$1&id=$2是要替换的格式,$1代表第一个括号匹配的值,$2代表第二个。 

上面的代码就是将URL结构导入sharexie/test.php中。把这些保存为.htaccess文件放在网站的根目录就行了。

test.php

<?php  
echo '你的Action是:' . $_GET['action'];  
echo '<br/>';  
echo '你的ID是:' . $_GET['id'];  
?> 

好了,我们现在在浏览器中输入:

127.0.0.1/view-12.html

输出的是:

你的Action是:view

你的ID是:12

1、讲解一下RewriteRule:

RewriteRule是重写规则,支持正则表达式的,上面的([0-9]{1,})是指由数字组成的,$是结束标志,说明是以数字结束!

2、RewriteRule配置参数

1) R 强制外部重定向
2) F 禁用URL,返回403HTTP状态码。
3) G 强制URL为GONE,返回410HTTP状态码。
4) P 强制使用代理转发。
5) L 表明当前规则是最后一条规则,停止分析以后规则的重写。
6) N 重新从第一条规则开始运行重写过程。
7) C 与下一条规则关联8) T=MIME-type(force MIME type) 强制MIME类型
9) NS  只用于不是内部子请求
10) NC 不区分大小写
11) QSA 追加请求字符串
12) NE 不在输出转义特殊字符   \%3d$1  等价于 =$1

举例:

1、将xianglc将定到 index.php?c=myuser&m=itime&domain=xianglc

RewriteRule ^([a-zA-Z0-9]){6,20}/?$ index.php?c=myuser&m=itime&domain=$0 [L] 

2、#RewriteRule ^/index.html$ /1.php [L]           
RewriteRule ^/index-(.*?)-(.*?)-(.*?)-(.*?)-(.*?)-(.*?)-(.*?)-(.*?)-(.*?)$ $9&a=$1&b=$2&c=$3&d=$4&e=$5&f=$6&g=$7&h=$8 [C,NC]  
RewriteRule ^(.*?)-(.*?)-(.*?)-(.*?)-(.*?)-(.*?).html(.*?)$ /1.php?$7&i=$1&j=$2&k=$3&l=$4&m=$5&n=$6 [QSA,L,NC]

3.2 一个路由解析器,用来解析规则,匹配和转换URL。

先将所有的链接转到index.php中,在index.php中进行路由分发,按照类和方法分配到相应的类文件中的函数上去。用$_SERVER['REQUEST_URI']取出URL中的www.xx.com/后面的部分,按照相关规则分别区分为class和mothod以及参数key=>value的值。最后include该类文件,执行其中的函数。实例如下:

<?php  
error_reporting(0);  
date_default_timezone_set("Asia/Shanghai");  
$_DocumentPath = $_SERVER['DOCUMENT_ROOT'];  
$_RequestUri = $_SERVER['REQUEST_URI'];  
$_UrlPath = $_RequestUri;  
$_FilePath = __FILE__;  
$_AppPath = str_replace($_DocumentPath, '', $_FilePath);    //==>\router\index.php  
$_AppPathArr = explode(DIRECTORY_SEPARATOR, $_AppPath);  
for ($i = 0; $i < count($_AppPathArr); $i++) {  
       $p = $_AppPathArr[$i];  
       if ($p) {  
           $_UrlPath = preg_replace('/^\/'.$p.'\//', '/', $_UrlPath, 1);  
       }  
    }     $_UrlPath = preg_replace('/^\//', '', $_UrlPath, 1);  
   $_AppPathArr = explode("/", $_UrlPath);  
   $_AppPathArr_Count = count($_AppPathArr);   
   $arr_url = array(  
       'controller' => 'sharexie/test',  
       'method' => 'index',  
       'parms' => array()  
   );  
   $arr_url['controller'] = $_AppPathArr[0];  
   $arr_url['method'] = $_AppPathArr[1];  
   if ($_AppPathArr_Count > 2 and $_AppPathArr_Count % 2 != 0) {  
       die('参数错误');  
   } else {  
       for ($i = 2; $i < $_AppPathArr_Count; $i += 2) {  
           $arr_temp_hash = array(strtolower($_AppPathArr[$i])=>$_AppPathArr[$i + 1]);  
           $arr_url['parms'] = array_merge($arr_url['parms'], $arr_temp_hash);  
       }  
   }      
   $module_name = $arr_url['controller'];  
   $module_file = $module_name.'.class.php';  
   $method_name = $arr_url['method'];  
   if (file_exists($module_file)) {  
       include $module_file;  
       $obj_module = new $module_name();  
       if (!method_exists($obj_module, $method_name)) {  
           die("要调用的方法不存在");  
       } else {  
           if (is_callable(array($obj_module, $method_name))) {  
               $obj_module -> $method_name($module_name, $arr_url['parms']);                
               $obj_module -> printResult();  
           }  
       }        
   } else {  
       die("定义的模块不存在");  
   }  
?>  
PHP 相关文章推荐
《PHP边学边教》(02.Apache+PHP环境配置――下篇)
Dec 13 PHP
php 按指定元素值去除数组元素的实现方法
Nov 04 PHP
调试PHP程序的多种方法介绍
Nov 06 PHP
ThinkPHP中__initialize()和类的构造函数__construct()用法分析
Nov 29 PHP
通过Email发送PHP错误的方法
Jul 20 PHP
PHP中strcmp()和strcasecmp()函数字符串比较用法分析
Jan 07 PHP
Yii2中使用join、joinwith多表关联查询
Jun 30 PHP
DEDE实现转跳属性文档在模板上调用出转跳地址
Nov 04 PHP
PHP闭包定义与使用简单示例
Apr 13 PHP
ThinkPHP框架整合微信支付之JSAPI模式图文详解
Apr 09 PHP
什么是PHP7中的孤儿进程与僵尸进程
Apr 14 PHP
phpstudy隐藏index.php的方法
Sep 21 PHP
通过curl模拟post和get方式提交的表单类
Apr 23 #PHP
Windows下的PHP安装文件线程安全和非线程安全的区别
Apr 23 #PHP
php自定义session示例分享
Apr 22 #PHP
php cli换行示例
Apr 22 #PHP
php使用百度天气接口示例
Apr 22 #PHP
phpmailer中文乱码问题的解决方法
Apr 22 #PHP
PHP函数addslashes和mysql_real_escape_string的区别
Apr 22 #PHP
You might like
php 多个submit提交表单 处理方法
2009/07/07 PHP
php中操作memcached缓存进行增删改查数据的实现代码
2014/08/15 PHP
支持中文、字母、数字的PHP验证码
2015/05/04 PHP
DOM 脚本编程中的兄弟节点
2009/10/31 Javascript
JavaScript判断密码强度(自写代码)
2013/09/06 Javascript
js快速排序的实现代码
2013/12/08 Javascript
JS实现倒计时和文字滚动的效果实例
2014/10/29 Javascript
JavaScript使用encodeURI()和decodeURI()获取字符串值的方法
2015/08/04 Javascript
Node.js+Express配置入门教程详解
2016/05/19 Javascript
关于Vue.js一些问题和思考学习笔记(1)
2016/12/02 Javascript
浅谈javascript alert和confirm的美化
2016/12/15 Javascript
js 输入框 正则表达式(菜鸟必看教程)
2017/02/19 Javascript
nodejs读取并去重excel文件
2018/04/22 NodeJs
如何在js代码中消灭for循环实例详解
2018/07/29 Javascript
vue实现todolist基本功能以及数据存储功能实例详解
2019/04/11 Javascript
微信小程序后台持续定位功能使用详解
2019/08/23 Javascript
使用layui+ajax实现简单的菜单权限管理及排序的方法
2019/09/10 Javascript
jQuery实现小火箭返回顶部特效
2020/02/03 jQuery
js与jquery获取input输入框中的值实例讲解
2020/02/27 jQuery
bpython 功能强大的Python shell
2016/02/16 Python
Python装饰器用法实例总结
2018/05/26 Python
Python实现去除图片中指定颜色的像素功能示例
2019/04/13 Python
django使用xadmin的全局配置详解
2019/11/15 Python
Python监控服务器实用工具psutil使用解析
2019/12/19 Python
html5实现输入框fixed定位在屏幕最底部兼容性
2020/07/03 HTML / CSS
定制iPhone和Macbook保护壳:Slick Case
2018/11/21 全球购物
华为菲律宾官方网站:HUAWEI Philippines
2021/02/23 全球购物
港湾网络笔试题
2014/04/19 面试题
汽车检测与维修专业求职信
2013/10/30 职场文书
运动会通讯稿300字
2014/02/02 职场文书
给老师的一封感谢信
2015/01/20 职场文书
解除同居协议书
2015/01/29 职场文书
农村婚庆主持词
2015/06/29 职场文书
热爱劳动主题班会
2015/08/14 职场文书
小程序教您怎样你零成本推广获取数万用户的方法
2019/07/30 职场文书
Java 实战项目之家居购物商城系统详解流程
2021/11/11 Java/Android