`
renzhen
  • 浏览: 251591 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

PHP简单的伪静态URL机制实现

阅读更多
   曾几何时,我们公司准备开发一套新的建站系统,决定将以前的框架给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为例:
<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
0
1
分享到:
评论

相关推荐

    php图片伪静态

    总结一下,PHP图片伪静态技术通过`.htaccess`文件的URL重写规则和`topic.php`主程序配合,实现了动态请求与静态URL的映射,提高了用户体验和搜索引擎优化的效果。同时,合理的图片存储路径管理确保了图片资源的正常...

    php 优化全通 php伪静态

    总结来说,PHP优化全通是提升网站性能的关键,而实现PHP伪静态则有助于提高网站的搜索引擎可见性。两者结合,既能保证网站运行效率,又能提升搜索引擎排名,从而带来更好的用户体验和业务增长。

    url伪静态简单案例

    总结来说,URL伪静态是一项提升网站质量和SEO效果的重要技术,通过伪装静态URL的形式,既保留了动态网站的灵活性,又获得了静态URL的优点。在实际应用中,我们需要根据服务器类型和所使用的框架或CMS选择合适的实现...

    php实现伪静态的方法(实用全面)

    URL重写是实现伪静态最常用的方法,通过Apache或Nginx服务器的配置文件进行设置。在Apache中,我们通常使用`.htaccess`文件,通过`RewriteEngine`指令和`RewriteRule`规则来实现。例如: ```apacheconf ...

    tags标签伪静态的方法

    3. **重写规则配置**:为了使服务器能够识别并正确处理伪静态URL,需要在服务器配置文件(如Apache的.htaccess文件或Nginx的配置文件)中添加URL重写规则。例如,将请求的伪静态URL重定向到实际的动态页面脚本上。 ...

    ASP程序实现网页伪静态页源代码

    在这个列表项中,每个文章标题都链接到了一个伪静态URL,例如`article.asp?/26.html`,这样的URL在用户看来就像一个静态页面,但实际上通过参数传递了文章ID。 #### 总结 通过上述分析,我们可以看出,使用ASP...

    伪静态配置实例大全

    在网站优化和搜索引擎友好性方面,伪静态技术扮演着重要的角色。它将动态网页的URL转化为看似静态的页面链接,从而提升用户体验并有利于SEO。本文将深入探讨伪静态配置的相关知识,包括其原理、作用以及如何进行配置...

    伪静态页面生成技术|静态页面|生成技术

    1. **URL重写**:通过配置Web服务器(如Apache或IIS)的规则,将动态URL转换为静态化的伪静态URL。例如,使用Apache的`.htaccess`文件或者IIS的`web.config`文件,配合Rewrite模块(如提供的Rewrite.dll)来实现URL...

    页面伪静态案例

    3. **框架与CMS系统支持**:许多流行的PHP框架(如Laravel、Symfony)和内容管理系统(如WordPress、Joomla)内置了伪静态功能,开发者可以通过简单的设置实现。例如,在WordPress中,可以在设置中开启“自定义结构...

    thinkphp3.1.3升级php7及nginx配置伪静态.zip

    5. **验证**:访问网站,确保可以正常运行且URL呈现伪静态形式。 以上就是关于ThinkPHP3.1.3升级到PHP7以及Nginx配置伪静态的详细说明。在这个过程中,`index.php`是入口文件,`ThinkPHP`是ThinkPHP框架的核心库,...

    zencart优化伪静态插件

    而伪静态URL,也就是看似静态但实际上由服务器动态生成的URL,能够使URL看起来更简洁、更符合人类阅读习惯,从而提高搜索引擎的抓取效率和用户体验。"Ultimate SEO URLs 优化插件"正是实现了这一目标,将原本动态的...

    UrlReWrite(Url重写或伪静态)

    4. **方便迁移和维护**:伪静态URL更容易在不同服务器间迁移,也便于后期网站结构的调整。 **三、UrlRewrite的配置与规则** UrlRewrite通常通过编写规则文件来实现URL重写,如IIS的web.config或Apache的.htaccess...

    nginx 伪静态 重定向

    Nginx,作为一款高性能的HTTP服务器和反向代理服务器,提供了强大的重定向功能,特别是其伪静态处理机制,能够帮助我们优雅地解决这些问题。 #### 2. 为什么需要伪静态与重定向 在网站运营过程中,若不实施有效的...

    Nginx和Apache之伪静态设置 (运维珍藏版)

    伪静态是指通过URL重写(即rewrite)技术将动态网页(例如 .php、.asp 或 .aspx 等格式)的地址转化为静态网页的形式,但实际上这些网页仍然是动态生成的。这种技术常用于提高网站对于搜索引擎的友好性(SEO),同时...

    简单的存储过程分页+伪静态

    同时,开发者需要在后端程序中解析这些伪静态URL,并返回相应的内容。 综合上述,这个主题中的示例可能是用存储过程来优化数据库查询,实现高效的分页功能,同时结合伪静态技术优化网站的SEO,让网页更容易被搜索...

    thinkphp+mysql中英文伪静态企业网站、完整无BUG源码

    1. 提升用户体验:伪静态URL更符合用户的阅读习惯,看起来更加直观。 2. SEO优化:搜索引擎更容易抓取和索引静态化的网页,有利于提升网站的搜索排名。 3. 加快访问速度:静态HTML页面加载速度比动态页面快,提升...

    PHP实例开发源码——SK电影伪静态缓存极速版 v1.1.zip

    在这个源码中,可能存在自定义的路由规则来解析和处理伪静态URL。 5. **数据库交互**:电影网站通常需要存储大量的电影信息,包括标题、演员、简介等,这需要与数据库进行交互。可能使用了PHP的PDO(PHP Data ...

    基于PHP的Flash小游戏伪静态版源码.zip

    【描述】中的"基于PHP的Flash小游戏伪静态版源码.zip"进一步强调了这个项目是关于实现Flash游戏的伪静态URL。在Web开发中,伪静态是一种技术手段,它将动态URL转换为静态URL的形式,以提高搜索引擎优化(SEO)和用户...

    基于PHP的KASEN动漫抓取伪静态缓存版php版源码.zip

    标题中的“基于PHP的KASEN动漫抓取伪静态缓存版php版源码”表明这是一个使用PHP编程语言开发的项目,主要用于从KASEN动漫网站抓取数据,并且采用了伪静态技术和缓存机制。这个项目可能是一个Web应用程序,允许用户...

    ISAPI Rewrite 2.9 URL伪静态

    ISAPI_Rewrite 2.9 是一款针对IIS(Internet Information Services)Web服务器的URL重写工具,它使得在IIS环境下实现URL伪静态功能变得简单易行。URL伪静态技术是现代网站优化搜索引擎优化(SEO)的重要手段,通过将...

Global site tag (gtag.js) - Google Analytics