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之第七天
Oct 09 PHP
几个学习PHP的网址
Nov 25 PHP
ionCube 一款类似zend的PHP加密/解密工具
Jul 25 PHP
php模拟socket一次连接,多次发送数据的实现代码
Jul 26 PHP
Php图像处理类代码分享
Jan 19 PHP
Android ProgressBar进度条和ProgressDialog进度框的展示DEMO
Jun 19 PHP
PHP函数preg_match_all正则表达式的基本使用详细解析
Aug 31 PHP
md5 16位二进制与32位字符串相互转换示例
Dec 30 PHP
如何使用PHP Embed SAPI实现Opcodes查看器
Nov 10 PHP
YII Framework框架教程之使用YIIC快速创建YII应用详解
Mar 15 PHP
php 数组随机取值的简单实例
May 23 PHP
PHP去除空数组且数组键名重置的讲解
Feb 28 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
动漫定律:眯眯眼都是怪物!这些角色狠话不多~
2020/03/03 日漫
php异常处理技术,顶级异常处理器
2012/06/13 PHP
PHP中图片等比缩放的实例
2013/03/24 PHP
PHP编写RESTful接口的方法
2016/02/21 PHP
PHP实现删除多重数组对象属性并重新赋值的方法
2017/06/07 PHP
IE FF OPERA都可用的弹出层实现代码
2009/09/29 Javascript
js保存当前路径(cookies记录)
2010/12/14 Javascript
javascript数字数组去重复项的实现代码
2010/12/30 Javascript
按钮接受回车事件的三种实现方法
2014/06/06 Javascript
通过JS判断联网类型和连接状态的实现代码
2015/04/01 Javascript
再次谈论React.js实现原生js拖拽效果引起的一系列问题
2016/04/03 Javascript
node.js 抓取代理ip实例代码
2017/04/30 Javascript
BootStrap Table复选框默认选中功能的实现代码(从数据库获取到对应的状态进行判断是否为选中状态)
2017/07/11 Javascript
js字符限制(字符截取) 一个中文汉字算两个字符
2017/09/12 Javascript
XMLHttpRequest对象_Ajax异步请求重点(推荐)
2017/09/28 Javascript
js经验分享 JavaScript反调试技巧
2018/03/10 Javascript
微信小程序中使用ECharts 异步加载数据的方法
2018/06/27 Javascript
浅谈高大上的微信小程序中渲染html内容—技术分享
2018/10/25 Javascript
微信小程序实现的自定义分享功能示例
2019/02/12 Javascript
基于vue-cli搭建多模块且各模块独立打包的项目
2019/06/12 Javascript
node.js express框架实现文件上传与下载功能实例详解
2019/10/15 Javascript
vuex存储复杂参数(如对象数组等)刷新数据丢失的解决方法
2019/11/05 Javascript
JavaScript监听一个DOM元素大小变化
2020/04/26 Javascript
代码块高亮可复制显示js插件highlight.js+clipboard.js整合
2021/02/15 Javascript
[05:06]TI4西雅图DOTA2前线报道 海涛密探LGD训练
2014/07/09 DOTA
Python内建数据结构详解
2016/02/03 Python
使用Python的Flask框架构建大型Web应用程序的结构示例
2016/06/04 Python
使用python对excel表格处理的一些小功能
2021/01/25 Python
世界上最好的儿童品牌:AlexandAlexa
2018/01/27 全球购物
一套英文Java笔试题面试题
2016/04/21 面试题
中学生爱国演讲稿
2013/12/31 职场文书
青年文明号复核材料
2014/02/11 职场文书
大学新生入学教育方案
2014/05/16 职场文书
永远是春天观后感
2015/06/12 职场文书
《曾国藩家书》读后感——读家书,立家风
2019/08/21 职场文书
mysql实现将字符串字段转为数字排序或比大小
2022/06/14 MySQL