boblog IIS Rewrite 伪静态规则文件 不指定

Heck post in 学习心得 2010/08/24 16:19 评论(0) 阅读(1141) | |
       最近投身于PHP研发之中,沉迷于其中无法自拔,总觉得PHP好啊,呵呵。偶尔写博客时,愈发觉得ASP不够爽。虽然ASBLOG是一个优秀的博客程序,虽不忍抛弃,但无奈PHP吸引力更大,于是就决定,转投PHP阵营。

    根据以往的测试经验,我放弃了效率低下的WordPress,选择Bo-blog这个PHP经典范例的博客程序。正好个人也想清理清理日志,于是全部手工迁移,耗费了整整一天的时间完成了这项庞大的任务,不完美之处,就是没能完成评论和留言的迁移,随他去吧,总会再多起来的。

      为了物尽其用,我打起了URL重写伪静态的主意,询问过空间商,得知我的主机支持ISAPI_Rewrite URL重写组件(自己用了半年了都不知道)。Bo-blog内置了URL Rewrite支持,但只提供了Apache上的.htaccess 这个伪静态规则文件。注释上说,IIS的伪静态规则文件,要自己去论坛找。于是我翻了几页帖子,终于耐不住了,根据那个.htaccess 修改一个吧。

    说干就干,通过对比已有的.htaccess和httpd.ini文件,发现二者配置似乎可以通用,都是RewriteRule关键字后面跟两个参数,第一个是伪静态地址,第二个是重写到的地址,使用正则表达式完成。于是我极有想象力地直接复制过去,测试……不管用……呃……


    怎么回事呢,重启服务器还是不行……嗯……引用《神探狄仁杰》上狄国老的话“我们一定是忽略了什么细节”,嗯,对,细节。于是我找来了DZ论坛上的httpd.ini文件仔细比对发现二者果然存在不同,在.htaccess 中没有匹配主机地址,只匹配了相对路径,而在httpd.ini文件中,需要匹配完整的HTTP地址,原来如此,于是RewriteRule ^t就被批量替换成了RewriteRule ^(.*)/。

    查阅了httpd.ini的参考后发现,如果需要忽略大小写,可以在每一条规则最后加上[I],这个大概是ignore的缩写吧。然后测试……晕,还是不管。

    一定还有什么地方不一样。于是我写了一条超简单的规则,把index.php重写为index.html,测试,忽忽,终于工作了~既然这样,问题就一定出在后面的参数上面了。先从那几个特殊符号下手。正则表达式中都是用“\”进行转义的,于是我就把后面的问号、连接号统统给转义了,果然,不再提示404错误,但依然不能正常访问到页面。是不是转义过头了?于是我使用排除法逐一试验,果然,只需屏蔽掉问号就OK了。以下就是修改好的httpd.ini文件内容

[ISAPI_Rewrite]

# 3600 = 1 hour
CacheClockRate 3600

RepeatLimit 32

# Protect httpd.ini and httpd.parse.errors files
# from accessing through HTTP
#URL Rewrite for bo-blog 2.1 Edit by starlight36
#http://www.hecks.tk

RewriteRule ^(.*)/post/([0-9]+)/?([0-9]+)?/?([0-9]+)?/?$ $1/read.php\?entryid=$2&page=$3&part=$4 [I]
RewriteRule ^(.*)/page/([0-9]+)/([0-9]+)/?$ $1/index.php\?mode=$2&page=$3 [I]
RewriteRule ^(.*)/starred/([0-9]+)/?([0-9]+)?/?$ $1/star.php\?mode=$2&page=$3 [I]
RewriteRule ^(.*)/category/([^/]+)/?([0-9]+)?/?([0-9]+)?/?$ $1/index.php\?go=category_$2&mode=$3&page=$4 [I]
RewriteRule ^(.*)/archiver/([0-9]+)/([0-9]+)/?([0-9]+)?/?([0-9]+)?/?$ $1/index.php\?go=archive&cm=$2&cy=$3&mode=$4&page=$5 [I]
RewriteRule ^(.*)/date/([0-9]+)/([0-9]+)/([0-9]+)/?([0-9]+)?/?([0-9]+)?/?$ $1/index.php\?go=showday_$2-$3-$4&mode=$5&page=$6 [I]
RewriteRule ^(.*)/user/([0-9]+)/?$ $1/view.php\?go=user_$2 [I]
RewriteRule ^(.*)/tags/([^/]+)/?([0-9]+)?/?([0-9]+)?/?$ $1/tag.php\?tag=$2&mode=$3&page=$4 [I]
RewriteRule ^(.*)/component/id/([0-9]+)/?$ $1/page.php\?pageid=$2 [I]
RewriteRule ^(.*)/component/([^/]+)/?$ $1/page.php\?pagealias=$2 [I]


#Force redirection for old rules
RewriteRule ^(.*)/post/([0-9]+)\.htm$ $1/post/$2/ [I]
RewriteRule ^(.*)/post/([0-9]+)\_([0-9]+)\.htm$ $1/post/$2/$3/ [I]
RewriteRule ^(.*)/post/([0-9]+)\_([0-9]+)\_([0-9]+)\.htm$ $1/post/$2/$3/$4/ [I]
RewriteRule ^(.*)/index\_([0-9]+)\_([0-9]+)\.htm$ $1/page/$2/$3/ [I]
RewriteRule ^(.*)/star\_([0-9]+)\_([0-9]+)\.htm$ $1/starred/$2/$3/ [I]
RewriteRule ^(.*)/category\_([0-9]+)\.htm$ $1/category/$2/ [I]
RewriteRule ^(.*)/category\_([0-9]+)\_([0-9]+)\_([0-9]+)\.htm$ $1/category/$2/$3/$4/ [I]
RewriteRule ^(.*)/archive\_([0-9]+)\_([0-9]+)\.htm$ $1/archiver/$2/$3/ [I]
RewriteRule ^(.*)/archive\_([0-9]+)\_([0-9]+)\_([0-9]+)\_([0-9]+)\.htm$ $1/archiver/$2/$3/$4/$5/ [I]
RewriteRule ^(.*)/showday\_([0-9]+)\_([0-9]+)\_([0-9]+)\.htm$ $1/date/$2/$3/$4/ [I]
RewriteRule ^(.*)/showday\_([0-9]+)\_([0-9]+)\_([0-9]+)\_([0-9]+)\_([0-9]+)\.htm$ $1/date/$2/$3/$4/$5/$6/ [I]

#Customized URL
RewriteRule ^(.*)/([^\/]*)\.html$ $1/$2/ [I]
RewriteRule ^(.*)/([^/|.]+)/?([0-9]+)?/?([0-9]+)?/?$ $1/read.php\?blogalias=$2&page=$3&part=$4 [I]



     hoho~,批量替换以后,终于搞定了这个httpd.ini文件,放在上面试验,效果很好~~可是,依然存在一些问题。首先,访问http://www.hecks.tk这样的地址会出现找不到日志,其次,不少子目录不能访问了。经过分析发现最后一行的网址别名设计存在问题(也可能只在IIS上有这个问题),空别名也被重写了,所以没有指定首页文件的时候就出现了错误,其次,这样使用的设计会屏蔽掉所有2级子目录。因为我的空间上可能会在二级目录放置东西,所以只好对程序进行修改了。

打开inc/url.php文件,找到28行附近的

修改为:

将上面的httpd.ini文件最后两行改为
引用

RewriteRule ^(.*)/blog/([^\/]*)\.html$ $1/$2/ [I]
RewriteRule ^(.*)/blog/([^/|.]+)/?([0-9]+)?/?([0-9]+)?/?$ $1/read.php\?blogalias=$2&page=$3&part=$4 [I]

这样一番修改之后,就网址别名就全部归属到这个不存在的blog目录下面了~除了这个目录这个目录里面的文件会受到影响以外,其他的文件都会正常~~当然,你也可以根据需要改成自己想要的名字,呵呵。jzan



来源:Heck's Blog
地址:http://www.hecks.tk/bo-blog-rewriteule-httpd/
转载时须以链接形式注明作者和原始出处及本声明,否则将追究法律责任,谢谢配合!
Tags: , , ,