无缝迁移blog
June 23, 2007
我使用的Blog系统是Subtext 1.9.5,原作为一个单独的Application(ashchan.com/blog)“嵌”在网站ashchan.com下面。这样配置有时候会出问题,比如我往ashchan.com上添加一个HttpModule的时候,有可能会造成ashchan.com/blog的出错。
同时,网站使用免费的ISAPI filter modrewrite (该产品网站目前我这里无法访问,原因未知)来处理URL重写(URL Rewriting),曾经测试过,在高并发访问时,该filter可能会出错造成应用程序池死掉。
因此对配置进行了更改,将blog从ashchan.com下迁出建成一个单独的站点(blog.ashchan.com),并将原来使用的modrewrite ISAPI filter去除,改为使用UrlRewritingNet.UrlRewrite。我个人使用,觉得这两个产品的优缺点分别如下:
| moerewrite | UrlRewritingNet | |
| 费用 | 免费 | 免费 |
| 发行方式 | 开源,Delphi,需自己编译,不提供Binary | 开源,C#,同时提供源码和Binary |
| 配置 | 需修改IIS站点配置,加入ISAPI filter | 以DLL方式置于网站bin目录下,如果需对非aspx页面进行重写,则需在IIS站点配置下对特定扩展名进行映射 |
| 性能 | 性能高,但测试中出现高并发访问下出错的情况(未查明原因,可能是配置或使用的问题) | 性能较高,稳定 |
| 对无扩展名URL的支持 | 支持 | 部分支持(使用该特性,需将所有扩展名的URL均映射至ASP.NET引擎) |
| 规则编写 | 以类似Apache modrewrite的正则语法、使用ini文本文件编写 | 以易读的语法在Web.config中编写 |
| 跨站转发 | 未测试,应该支持 | 支持 |
ashchan.com使用的URL,大部分可以直接使用UrlRewritingNet来实现重写,这些URL以.aspx或.html为扩展名,其中以.html为扩展名的需在IIS中设置以ASP.NET来处理。
另外一些无扩展名的URL,如http://ashchan.com/tag/photo,则无法使用,因为我不想让ASP.NET 引擎来处理所有文件的请求。
这就要用到其他的方案来协同了。方案很简单,自定义404错误,然后在处理404错误的aspx页面分析url,发现是上面类型的无扩展名的url则转至相关页面。
最后还剩下blog的url未处理。原来的形如www.ashchan.com/blog/archive/2007/03/16/refresh.aspx的页面,需要转向至blog.ashchan.com/archive/2007/03/16/refresh.aspx,而且最好是301跳转,这样对搜索引擎比较友好。这也好办,使用如下规则即可:
<add name="blog_2" virtualUrl="^http\://www.ashchan.com/blog/(.*).aspx"
rewriteUrlParameter="ExcludeFromClientQueryString"
destinationUrl="http://blog.ashchan.com/$1.aspx"
redirect="Domain"
redirectMode="Permanent"
ignoreCase="true" />
大功搞掂!但愿301跳转能把PR给保留转移到新的地址上来。


