做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部分依然是需要的,但是很简单:
- RewriteEngine On
- RewriteRule ^/index(.*)\.html$ /index.php?q=$1
意思是不管有多少参数,都作为一个整体传给index.php
然后在index.php里,程序开始的地方,加上:
- if(isset($_GET['q']) && !empty($_GET['q']))
- {
- $q = $_GET['q'];
- if(preg_match_all('#_([a-z]+)(\d+)#',$q,$matches))
- {
- foreach ($matches[1] as $i=>$key)
- {
- ${$key}=$matches[2][$i];
- }
- }
- }
- //在程序的其它部分,就可以使用这些选项和选项的值了。
比如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/
没有评论:
发表评论