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 ADODB使用方法集锦
Mar 25 PHP
深入PHP与浏览器缓存的分析
Jun 03 PHP
Smarty中常用变量操作符汇总
Oct 27 PHP
php管理nginx虚拟主机shell脚本实例
Nov 19 PHP
PHP计算日期相差天数实例分析
Feb 23 PHP
php事件驱动化设计详解
Nov 10 PHP
PHP下载远程图片的几种方法总结
Apr 07 PHP
基于win2003虚拟机中apache服务器的访问
Aug 01 PHP
php+ajax实现仿百度查询下拉内容功能示例
Oct 20 PHP
PHP基于curl模拟post提交json数据示例
Jun 22 PHP
laravel框架创建授权策略实例分析
Nov 22 PHP
基于php+MySql实现学生信息管理系统实例
Aug 04 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遍历树的常用方法汇总
2015/06/18 PHP
浅谈php(codeigniter)安全性注意事项
2017/04/06 PHP
YII框架常用技巧总结
2019/04/27 PHP
laravel 修改记住我功能的cookie保存时间的方法
2019/10/14 PHP
TP5(thinkPHP5)框架使用ajax实现与后台数据交互的方法小结
2020/02/10 PHP
基于jquery的一个拖拽到指定区域内的效果
2011/09/21 Javascript
JS window对象的top、parent、opener含义介绍
2013/12/03 Javascript
node.js中使用socket.io的方法
2014/12/15 Javascript
javascript函数式编程实例分析
2015/04/25 Javascript
js数组去重的方法汇总
2015/07/29 Javascript
学习Javascript闭包(Closure)知识
2016/08/07 Javascript
js实现对table的增加行和删除行的操作方法
2016/10/13 Javascript
jQuery层级选择器实例代码
2017/02/06 Javascript
vue元素实现动画过渡效果
2017/07/01 Javascript
react-native 完整实现登录功能的示例代码
2017/09/11 Javascript
vue使用swiper实现中间大两边小的轮播图效果
2019/11/24 Javascript
js实现AI五子棋人机大战
2020/05/28 Javascript
你知道JavaScript Symbol类型怎么用吗
2020/01/08 Javascript
vue页面加载时的进度条功能(实例代码)
2020/01/13 Javascript
对python指数、幂数拟合curve_fit详解
2018/12/29 Python
python 普通克里金(Kriging)法的实现
2019/12/19 Python
Python单链表原理与实现方法详解
2020/02/22 Python
python 插入日期数据到Oracle实例
2020/03/02 Python
Django models filter筛选条件详解
2020/03/16 Python
聊聊python中的循环遍历
2020/09/07 Python
浅析python 字典嵌套
2020/09/29 Python
eBay比利时购物网站:eBay.be
2019/08/09 全球购物
成人大专生实习期的自我评价
2013/10/02 职场文书
计算机个人求职信范例
2014/01/24 职场文书
函授本科个人自我鉴定
2014/03/25 职场文书
《花瓣飘香》教学反思
2014/04/15 职场文书
企业指导教师评语
2014/04/28 职场文书
办公室主任个人总结
2015/02/28 职场文书
创业计划书之密室逃脱
2019/11/08 职场文书
Python turtle编写简单的球类小游戏
2022/03/31 Python
vue实现input输入模糊查询的三种方式
2022/08/14 Vue.js