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 用sock技术发送邮件的函数
Jul 21 PHP
php下过滤HTML代码的函数
Dec 10 PHP
探讨PHP中this,self,parent的区别详解
Jun 08 PHP
PHP编程中的常见漏洞和代码实例
Aug 06 PHP
PHP中通过fopen()函数访问远程文件示例
Nov 18 PHP
php中ltrim()、rtrim()与trim()删除字符空格实例
Nov 25 PHP
php读取远程gzip压缩网页的方法
Dec 29 PHP
thinkphp3.2中Lite文件替换框架入口文件或应用入口文件的方法
May 21 PHP
Yii2实现同时搜索多个字段的方法
Aug 10 PHP
PHP调用API接口实现天气查询功能的示例
Sep 21 PHP
PHP基于堆栈实现的高级计算器功能示例
Sep 15 PHP
PHP实现的支付宝支付功能示例
Mar 26 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 中 DOMDocument保存xml时中文出现乱码问题的解决方案
2016/09/19 PHP
php中strlen和mb_strlen用法实例分析
2016/11/12 PHP
PHP屏蔽关键字实现方法
2016/11/17 PHP
jQuery html() in Firefox (uses .innerHTML) ignores DOM changes
2010/03/05 Javascript
浏览器打开层自动缓慢展开收缩实例代码
2013/07/04 Javascript
JS图片切换的具体方法(带缩略图版)
2013/11/12 Javascript
css结合js制作下拉菜单示例代码
2014/02/27 Javascript
jquery.validate.js插件使用经验记录
2014/07/02 Javascript
jquery解决客户端跨域访问问题
2015/01/06 Javascript
jQuery读取XML文件内容的方法
2015/03/09 Javascript
使用jQuery实现更改默认alert框体
2015/04/13 Javascript
javaScript中Math()函数注意事项
2015/06/18 Javascript
node.js调用C++开发的模块实例
2015/07/03 Javascript
浅析JavaScript中var that=this
2017/02/17 Javascript
JavaScript监听手机物理返回键的两种解决方法
2017/08/14 Javascript
Node.js中的不安全跳转如何防御详解
2018/10/21 Javascript
JS实现骰子3D旋转效果
2019/10/24 Javascript
react PropTypes校验传递的值操作示例
2020/04/28 Javascript
python 获取文件列表(或是目录例表)
2009/03/25 Python
Python使用百度API上传文件到百度网盘代码分享
2014/11/08 Python
简单介绍Python中的RSS处理
2015/04/13 Python
浅谈Python使用Bottle来提供一个简单的web服务
2017/12/27 Python
PyQt5 pyqt多线程操作入门
2018/05/05 Python
Python List cmp()知识点总结
2019/02/18 Python
pytorch三层全连接层实现手写字母识别方式
2020/01/14 Python
Python虚拟环境库virtualenvwrapper安装及使用
2020/06/17 Python
小结Python的反射机制
2020/09/28 Python
python3中布局背景颜色代码分析
2020/12/01 Python
css3 transform属性详解
2014/09/30 HTML / CSS
三星法国官方网站:Samsung法国
2019/10/31 全球购物
团日活动总结范文
2014/04/25 职场文书
写求职信有哪些注意事项
2014/05/08 职场文书
教师工作失职检讨书
2014/09/18 职场文书
2019年12月24日平安夜祝福语集锦
2019/12/24 职场文书
如何使用分区处理MySQL的亿级数据优化
2021/06/18 MySQL
使用Python开发贪吃蛇游戏 SnakeGame
2022/04/30 Python