2013年1月10日星期四

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

做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。

摘自:http://blog.163.com/eyoukey@126/blog/static/131527561200911414133692/

没有评论: