想了好几天,终于决定好了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