想了好几天,终于决定好了URL的重写方案,使用了更加符合真正静态文件思路的目录层次和静态html文件的方式对日志模块的几个最重要部分进行了重写。

详细内容 /blog/article/22.html 实际地址为 /?m=blog&a=article&id=22

存档日志 /blog/archive/2007-09.html 实际地址为 /?m=blog&a=archive&year=2007&month=09 无分页

标签云(标签列表) /blog/tag/ 实际地址为 /?m=blog&a=tagcloud

标签 /blog/tag/GPWS/ 实际地址为 /?m=blog&a=tag&tag=GPWS 无分页

就重写了这几个页面。

过程中比较深刻的几点体会:

1. 如果需要重写页面为不同层次的目录,需要注意两个问题:一是链接地址,二是cookie的有效路径。

2. 链接的地址需要使用相对根目录“/”而不能使用相对当前目录的地址,例如图片目录应该用“/images/”表示而不是“images/”或“./images/”。

3. PHP的setcookie函数设置的path默认为脚本的当前目录,所以需要在setcookie函数里面指定cookie的有效路径为站点根目录,如有需要可以设置在整个域范围有效。

4. RewriteRule重新规则是不会匹配QueryString的,但是你可以在替换的地址上加上原来的QueryString, 虽然一般都变成静态化了并不需要带参数,但是有某些特殊需求的就要,例如我需要自动给URL传递会话id,即使是如 /blog/article/22.html?sid=xxxxxx这样的地址也可以传递参数。如果需要对QuerySting进行匹配,可以结合 RewriteCond来实现。

下面是我的重写规则,可以放在.htaccess文件里面。

##为不带斜杠结束的地址添加斜杠
RewriteRule ^blog$ blog/?%{QUERY_STRING} [R]
RewriteRule ^blog/([^\.]*[^\./])$ blog/$1/?%{QUERY_STRING} [R]
##日志  
RewriteRule ^blog/$ index.php?m=blog&%{QUERY_STRING} [L]
RewriteRule ^blog/article/$ blog/ [R]
RewriteRule ^blog/article/([0-9]+)\.html$ index.php?m=blog&a=article&id=$1&%{QUERY_STRING} [L]
##日志 - 存档  
RewriteRule ^blog/archive/$ blog/ [R]
RewriteRule ^blog/archive/([0-9]{4})-([0-9]{2})\.html$ index.php?m=blog&a=archive&year=$1&month=$2&%{QUERY_STRING} [L]
##日志 - 标签  
RewriteRule ^blog/tag/$ index.php?m=blog&a=tagcloud&%{QUERY_STRING} [L]
RewriteRule ^blog/tag/([^/]+)/$ index.php?m=blog&a=tag&tag=$1&%{QUERY_STRING} [L]

还有一句是可以自动给所有不以斜杠结尾的路径自动添加斜杠的,但是由于匹配的范围太大,可能会影响性能,不过不了解Rewrite引擎的运作方式,我也不清楚。

RewriteRule ^([^\.]*[^\./])$ /$1/ [R]

 

来源:http://www.ghoul.cn/blog/article/49.html#more

posted on 2008-09-04 11:40  8user  阅读(657)  评论(0编辑  收藏  举报