注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

phperwuhan的博客

记载一个phper的历程!phperwuhan.blog.163.com

 
 
 

日志

 
 

简单灵活的url rewrite(php实现)  

2012-04-18 11:48:25|  分类: php |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

来源:http://hi.baidu.com/_doc/blog/item/5886f9dc3a26a0abcd116688.html

做seo,免不了要用url rewrite。
在项目中遇到这样的问题:一个程序可选参数特别多,可能有6-7个之多。这个时候用apache自身的rewrite去实现优美的链接,就有点力不从心。
还好我们有php。
rewrite之前的链接规则可能是这样的:
index.php?id=100 rewrite成 index_id100.html
index.php?id=100&vb=1 rewrite成 index_id100_vb1.html
index.php?id=100&o=2&c=7 rewrite成 index_id100_o2_c7.html
index.php?id=100&vb=1&o=2&c=7 rewrite成 index_id100_vb1_o2_c7.html
index.php?id=100&vb=1&o=2&c=7&b=121&s=124 rewrite成 index_id100_vb1_o2_c7_b121_s124.html
一共有6个选项,分别是id,vb,o,c,b,s。每个参数都可能出现。如果不出现就不要在rewrite之后的链接里出现。如果用apache自身的rewrite。实现起来比较麻烦,我想到的是把每个选项做一次rewrite,最后rewrite成最终的结果。这样很复杂,而且也不灵活。

其实我们有简单的解决办法。
apache rewrite部分依然是需要的,但是很简单:

  1. RewriteEngine On
  2. RewriteRule ^/index(.*)\.html$ /index.php?q=$1

意思是不管有多少参数,都作为一个整体传给index.php

然后在index.php里,程序开始的地方,加上:

  1. if(isset($_GET['q']) && !empty($_GET['q']))
  2.   {
  3.   $q = $_GET['q'];
  4.   if(preg_match_all('#_([a-z]+)(\d+)#',$q,$matches))
  5.   {
  6.   foreach ($matches[1] as $i=>$key)
  7.   {
  8. ${$key}=$matches[2][$i];
  9.   }
  10.   }
  11.   }
  12.   //在程序的其它部分,就可以使用这些选项和选项的值了。

比如index_id100_o2_c7.html会被解析到 index.php?q=id100_o2_c7
然后程序部分,会解析,得到$id=100;$o=2;$c=7;然后在程序里使用这些变量。

其实像很多框架,像cakephp,都是通过类似的思路来实现复杂的路由和rewrite。

  评论这张
 
阅读(610)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017