- 浏览: 247953 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
aqyzcs:
你好,我想问一下,这个羽毛(Feather)图片编辑器里面自带 ...
给自己的Web站点嵌入一个免费的图片编辑器 -
wwx840723:
$db = ADONewConnection("ms ...
为PHP微软SQL Server驱动加入更好的ADODB支持 -
qxinfo:
还不如看看这个简单版的crmhttp://crm.fzerp. ...
用PHP开发CRM一年多小记 -
星光1224:
谢谢分享~~有一个问题:http://renzhen.itey ...
客户端JavaScript实战撤销恢复功能总结 -
hanbiaoo:
安装node.js, uglifyjs都不是必须的。文件目录调 ...
放弃繁琐的配置!直接使用UglifyJS批量压缩目录下所有JS文件
曾几何时,我们公司准备开发一套新的建站系统,决定将以前的框架给KO掉,重新开发一套新的框架来适应新的系统功能。领导们不希望使用外面已有的框架,号称要开发有自己特色的框架(不懂开发的领导害死人)。于是我们又投入到了新的开发当中。
由于我们的系统支持伪静态,以前的系统是直接使用服务器apache或IIS自带的rewrite文件定义规则,而框架中没有任何路由机制,于是这次框架准备使用新的策略,由PHP实现路由机制。于是我开始了功能实现的探索之路。
开发之前,我先了解‘路由机制’要做什么,它主要做两件事。
1.路由机制就是把某一个特定形式的URL结构中提炼出来系统对应的参数。举个例子,如:http://main.wopop.com/article/1 其中:/article/1 -> ?_m=article&id=1。
2.其次,是将拥有对应参数的URL转换成特定形式的URL结构,是上面的过程的逆向过程。由于路由机制隔离了URL结构和参数的转换关系,使的日后结构的变化不会影响下面代码的执行。
通过上面的了解,可以得出要编写一个路由机制要一下几步:
1.编写服务器apache或IIS自带的rewrite文件,将URL结构导入index.php。
2.一个路由规则配置文件。
3.一个路由解析器,用来解析规则,匹配和转换URL。
于是,我们一一实现其中的每一个部分。
1.rewrite文件编写,以Apache为例:
上面的代码就是将URL结构导入index.php中,具体的rewrite细节就不赘述了。
2.在PHP中设置一个路由规则配置文件routes.php,我简单的使用了一个hash数组编写规则:
3.路由机制中最复杂也是最重要的一部分,就是解析器。
解析器有两个类组成(名字可能起的不佳)。
一个是Route,作为整个解析器对外的接口,用于解析规则,匹配和转换URL,然而它只是一个代理,实际操作不是直接由它直接做的。
一个是RoutePattern,每个RoutePattern实例对应规则数组中的一条记录,一个Route实例包含多个RoutePattern,而Route中的所有操作都会调用内部所有RoutePattern实例操作,并进行整合。
关于路由配置文件的解析,主要细节全在类RoutePattern中,关于RoutePattern中对规则的解析、URL匹配和转换URL细节,篇幅和精力有限,今天就不详细介绍了,下回再仔细分析。
我的微博地址:http://weibo.com/jameren,欢迎大家关注,:lol: 。
顺便做个广告:
我最近使用了15G超大空间免费网络U盘—@酷盘,可在PC及手机上使用,无文件类型及大小限制,传输速度快,文件永不丢失,一起来体验吧!通过下面的邀请链接注册,你和我都将额外获得256MB的酷盘空间! http://t.cn/aNLZje
由于我们的系统支持伪静态,以前的系统是直接使用服务器apache或IIS自带的rewrite文件定义规则,而框架中没有任何路由机制,于是这次框架准备使用新的策略,由PHP实现路由机制。于是我开始了功能实现的探索之路。
开发之前,我先了解‘路由机制’要做什么,它主要做两件事。
1.路由机制就是把某一个特定形式的URL结构中提炼出来系统对应的参数。举个例子,如:http://main.wopop.com/article/1 其中:/article/1 -> ?_m=article&id=1。
2.其次,是将拥有对应参数的URL转换成特定形式的URL结构,是上面的过程的逆向过程。由于路由机制隔离了URL结构和参数的转换关系,使的日后结构的变化不会影响下面代码的执行。
通过上面的了解,可以得出要编写一个路由机制要一下几步:
1.编写服务器apache或IIS自带的rewrite文件,将URL结构导入index.php。
2.一个路由规则配置文件。
3.一个路由解析器,用来解析规则,匹配和转换URL。
于是,我们一一实现其中的每一个部分。
1.rewrite文件编写,以Apache为例:
<IfModule mod_rewrite.c> RewriteEngine On RewriteRule ^index\.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule (.+) index.php/$1 [L] </IfModule>
上面的代码就是将URL结构导入index.php中,具体的rewrite细节就不赘述了。
2.在PHP中设置一个路由规则配置文件routes.php,我简单的使用了一个hash数组编写规则:
/** *路由配置文件编写说明: * 路由配置在一个array数组中,一条记录代表一个规则 * 其中数组key的数据代表匹配的路径格式:使用特定的字符串标识 如:'/{id}' * 字符串中可以包含特定的变量,所有变量使用大括号{}包裹起来 * 数组value里是一个array数组,是对key中路径中变量进行特定处理 * 变量写在数组的key中,规范写在数组的value里,如:array('id'=>'/\d+/','_m'=>'frontpage','_a'=>'index') * 规范分成两类: * 1.格式判断:比如 '/{id}'=> array('id'=>'/\d+/','_m'=>'frontpage','_a'=>'index') 为例,其中'id'=>'/\d+/'就是一个格式判断, * 表示id变量只能是数字,格式判断后面只能使用正则表达式,由于PHP没有正则类,所以我指定 '/XXX/'和'#XXX#'格式的字符串为正则表达式 * 2.默认参数:比如 '/{id}'=> array('id'=>'/\d+/','_m'=>'frontpage','_a'=>'index') 为例,其中'_m'=>'frontpage'就是一个默认参数, * 因为前面的路径没有_m和_a信息,所以后面会使用默认参数作为_m和_a的值 * * 所以对于规则'/{id}'=> array('id'=>'/\d+/','_m'=>'frontpage','_a'=>'index')。我传入 /3 系统会转换成 index.php?_m=frontpage&_a=index&id=3 * * 规则匹配是按照$routes数组的顺序逐一匹配,一旦匹配上了就不往下匹配了。所以一些特定的匹配规则要放在前面,通用的放在后面。 * 否则可能导致不执行特定的匹配规则了 */ $routes= array( '/' => array('_m'=>'wp_frontpage','_a'=>'index'), '/{id}'=> array('id'=>'/\d+/','_m'=>'wp_frontpage','_a'=>'index'), '/{_m}/{_a}/{id}'=> array('id'=>'/\d+/'), '/{_m}/{_a}'=> array() );
3.路由机制中最复杂也是最重要的一部分,就是解析器。
解析器有两个类组成(名字可能起的不佳)。
一个是Route,作为整个解析器对外的接口,用于解析规则,匹配和转换URL,然而它只是一个代理,实际操作不是直接由它直接做的。
一个是RoutePattern,每个RoutePattern实例对应规则数组中的一条记录,一个Route实例包含多个RoutePattern,而Route中的所有操作都会调用内部所有RoutePattern实例操作,并进行整合。
class Route { private static $instance = null; private $routepatterns=array(); private function __construct() { $routes = array(); include ROOT."/routes.php"; foreach($routes as $key=>$value){ $this->routepatterns[]=new RoutePattern($key,$value); } if(!isset($_SERVER['PATH_INFO'])) return false; $urlpath= $_SERVER['PATH_INFO']; $ismatch=$this->match_url($urlpath); $strip_urlpath=str_replace('/','',$urlpath); if(!$ismatch&&!empty($strip_urlpath)){ Content::redirect(PAGE_404); } } /** * 用路由规则匹配对应的url地址,匹配成功将对应url参数放入$_GET中 * @param string url地址 * @return bool 是否匹配成功 */ public function match_url($urlpath){ foreach($this->routepatterns as $router){ $urlargs=$router->match_url($urlpath); if($urlargs!==false){ $_GET=array_merge($urlargs,$_GET); return true; } } return false; } public function rewrite_url($urlparams){ foreach($this->routepatterns as $router){ $urlstr=$router->rewrite_url($urlparams); if($urlstr!==false){ return $urlstr; } } $actualparams=array(); foreach($urlparams as $arg=>$val){ $actualparams[]=$arg."=".urlencode($val); } $actualparamstr=implode('&', $actualparams); $rewriteurl="/index.php"; if(!empty($rewriteurl))$rewriteurl.="?{$actualparamstr}"; return $rewriteurl; } public static function init() { if (null == self::$instance) { self::$instance = new Route(); } return self::$instance; } } class RoutePattern{ //...... }
关于路由配置文件的解析,主要细节全在类RoutePattern中,关于RoutePattern中对规则的解析、URL匹配和转换URL细节,篇幅和精力有限,今天就不详细介绍了,下回再仔细分析。
我的微博地址:http://weibo.com/jameren,欢迎大家关注,:lol: 。
顺便做个广告:
引用
我最近使用了15G超大空间免费网络U盘—@酷盘,可在PC及手机上使用,无文件类型及大小限制,传输速度快,文件永不丢失,一起来体验吧!通过下面的邀请链接注册,你和我都将额外获得256MB的酷盘空间! http://t.cn/aNLZje
发表评论
-
UglifyJS压缩的一个奇怪的bug及解决办法
2012-11-13 10:42 6963今天遇到一个很奇怪的问题,在开发测试没有问题的JS代码, ... -
放弃繁琐的配置!直接使用UglifyJS批量压缩目录下所有JS文件
2012-10-18 08:47 9098JS代码压缩是一种十分常见的前端优化的手段,对于大量 ... -
给自己的Web站点嵌入一个免费的图片编辑器
2012-10-15 10:20 17772随着open api运动的流行和深入,很多原本需 ... -
PHP实现IP黑白名单过滤
2012-09-13 10:17 6941需求来自一个运维的同事,对一个php文件执行进行IP过 ... -
客户端JavaScript实战撤销恢复功能总结
2012-03-19 17:02 11565撤销和恢复功能,英文为:Undo和Redo,快捷键 ... -
如何脱离Rails单独使用activesupport
2012-03-13 13:17 1484我一直有使用Ruby写一些脚本的习惯,active ... -
神奇的Apache Rewrite,程序员使用Rewrite的一些体会
2012-02-15 11:42 1866最近在公司开发工作中,一些功能使用了Apache Rew ... -
PHP高效获取树结构信息
2011-12-30 11:26 6938在开发中,经常有一 ... -
PHP简单的伪静态URL机制实现
2011-12-29 12:51 11曾几何时,我们公司准备开发一套新的建站系统,决定将以前的 ... -
Chorme插件练手之作——27270.net美女图片查看器
2011-09-23 13:24 7337最近对Google的相关技术比较感兴趣,刚刚学了一下 ... -
Android Notification 传递参数[转]
2011-09-21 09:07 5988请大家先看这个说明: 相信大家在使用课本或者其他资料时 ... -
Make code sweet.PHP特殊用法的一些总结(2)--PHP中的‘callback’回调
2011-07-11 17:26 2035本章总结一下PHP中‘callback’的一些实用用法。 1 ... -
Make code sweet.PHP特殊用法的一些总结(1)
2011-07-07 10:46 893最近一个项目接近尾声了,工作慢慢轻松了下来,闲暇时就看看 ... -
PHP应用客户端传复杂参数,JSON vs jQuery.param
2011-06-17 11:26 1967最近,我们的网站系统出现了问题,一个保存布局 ... -
PHP框架,伤不起啊,伤不起
2011-06-07 00:05 1690自从Rails刮起了一阵框架风,其它语言群起响应,Java,P ... -
PHP的惰性加载和Iterator的使用
2011-05-23 11:21 3378最近换了工作,改做建站软件了,我们公司建站软件的模板系统出了问 ... -
PHP输出非HTML格式文件总结
2011-04-14 16:37 4540在PHP系统开发中,除了显示HTML外,偶尔也会遇到输出 ... -
PHP中使用static变量做缓存(小技巧)
2011-03-10 13:16 5603我最近为客户做一 ... -
Prototype 函数Position.clone在IE下失效
2011-03-04 14:01 940在我们的系统中,经常会用到点击一个按钮,于是在这个按钮的周 ... -
PHP根据年份和周数获取日期
2011-03-03 17:24 5771这个是我总结PHP时间操作的第二篇文章,在开发周报,会用 ...
相关推荐
本案例主要使用PHP 7中的文件读写功能与ob缓存机制实现纯静态页面的生成,使用正则表达式和url重写实现伪静态页面的生成。 PHP页面静态化,是把那些内容不常变化的页面静态化,而不通过动态程序从数据库或者缓存中...
二、主要技术本案例主要使用PHP 7中的文件读写功能与ob缓存机制实现纯静态页面的生成,使用正则表达式和url重写实现伪静态页面的生成 三、效果图展示实现效果图
ThinkPHP 作为 PHP 框架,是单一入口的,那么其原始的 URL 便不是那么友好。但 ThinkPHP 提供了各种机制来定制需要的 URL 格式,配合 Apache .htaccess 文件,更是可以定制出人性化的更利于 SEO 的 URL 地址来。
同样拥有VIP版的模板引擎技 术、强大的文件缓存机制,但没有VIP版的伪原创跟自定义URL等多项创新的搜索引擎优化技术,除此之外也是一款高效的API数据系统实现无人值守全自动 化运行的淘宝客网站程序。 本系统...
2. 全站伪静态.html结尾:无论您偷取什么样的网站,ASP,PHP,ASPX,本程序都会在内部自动转换参数,全部以.html伪静态方式结尾,如果您觉得我们默认的URL路径不好用或者不喜欢,没关系!我们为您准备了各种服务 器...
功能与亮点:1、多站点模式无需服务器,只需一个虚拟空间,架设多个完全独立的站点,并可分别设置空间大小,数据互不干扰2、全站伪静态URL轻松开启html伪静态URL访问模式,提升搜索引擎的友好度,并可随时关闭3、...
功能与亮点:1、多站点模式无需服务器,只需一个虚拟空间,架设多个完全独立的站点,并可分别设置空间大小,数据互不干扰2、全站伪静态URL轻松开启html伪静态URL访问模式,提升搜索引擎的友好度,并可随时关闭3、...
Leaps简单php开发 for You !现在PHP开发框架非常多,一个开发框架优秀与否与它有多少特性没有太大的关系。特性也不能告诉你框架代码的质量... 高效url路由,url生成,伪静态等 错误异常日志、访问日志 常用方法集成。
Leaps简单php开发 for You ! 现在PHP开发框架非常多,一个开发框架优秀与否与它有多少特性没有太大的关系。特性也不能告诉你框架代码的... 高效url路由,url生成,伪静态等 错误异常日志、访问日志 常用方法集成。
Leaps简单php开发 for You ! 现在PHP开发框架非常多,一个开发框架优秀与否与它有多少特性没有太大的关系。特性也不能告诉你框架代码的...高效url路由,url生成,伪静态等 错误异常日志、访问日志 常用方法集成。
生成静态:semcms:asp版可生成整站纯静态html格式(一键生成方式),php版可全站伪静态使用 url 重写机制。 缩略图:上传图片结合aspjpeg组件可生成大图与小图及自定义水印位置,无限制上传图片。 图片展示:结合...
生成静态:semcms:asp版可生成整站纯静态html格式(一键生成方式),php版可全站伪静态使用 url 重写机制。 缩略图:上传图片结合aspjpeg组件可生成大图与小图及自定义水印位置,无限制上传图片。 图片展示:结合...
1、新增源端口号留存的日志插件2、新增招聘信息二维码推广模块3、新增简历信息二维码推广模块4、新增会员交互信息的管理模块5、新增会员交互...命名规则11、优化伪静态URL路径及命名规则12、优化系统核心构架及缓存机制...
生成静态:semcms:asp版可生成整站纯静态html格式(一键生成方式),php版可全站伪静态使用 url 重写机制。 缩略图:上传图片结合aspjpeg组件可生成大图与小图及自定义水印位置,无限制上传图片。 图片展示:结合...
让简洁与强大并存纯静态、伪静态,全部支持自由设置规则,内容、栏目自由设置URL格式。系统功能:1、会员自助发布,会员发布管理,发布审核2、系统功能:静态HTML生成、自定义模板标签、附件清理、数据备份恢复3、在线...
修正了URLREWRITE伪静态的存在问题 修正全部已知的bug ChangLog: 无临时目录情况下将自动新建目录而不是提示错误 在sae环境未开启mysql时将提示 去除文件缓存多级目录的处理,因其会带来管理上的开销。 ...
·伪静态,url伪静态化,有利于seo ·自动缓存自动更新,可设置缓存时间达到自动更新,css缓存 ·简繁体互转 ·代理IP、伪造IP、随机IP、伪造user-agent、伪造referer来路、自定义cookie,以便应对防采集措施 ·url...
纯静态、伪静态,全部支持自由设置规则,内容、栏目自由设置URL格式。 系统功能: 1、会员自助发布,会员发布管理,发布审核 2、系统功能:静态HTML生成、自定义模板标签、附件清理、数据备份恢复 3、在线升级...
易企CMS:国内首款完全基于SEO友好性开发的...2、实现全站URL伪静态;3、个性化设置每个页面的标题标签、描述标签、关键词标签;4、全站每个页面良好的互联和更新机制;5、长尾关键词记录单。6、定时发布文章及产品功能。