不过事实上,如果要实现上述功能,我们也可以分两步进行。首先我们在
IIS 级别使用
IIRF 进行 URL Rewrite,接着在 ASP.NET 级别作进一步的 URL Rewrite。例如我
“
们现在要实现将
http://jeffz.domain.com/articles”
“
重写为
/ArticleList.aspx?
owner=jeffz” , 就 可 以 先 在 让 IIRF 做 第 一 次 URL Rewrite , 目 的 是 将
“/articles”
“
重写至
/ArticleList.aspx”。
RewriteRule ^/Articles$ /ArticleList.aspx [I, L, U]
这样,
ASP.NET 引擎就会直接接收到一个针对/ArticleList.aspx 的请求了。然后在
ASP.NET 内部,我们可以作第二次的 URL Rewrite(方便起见,我这里还是在
Global.asax 里写,在项目中还是建议使用额外的 HttpModule 来实现)。
protected void Application_BeginRequest(object sender, EventArgs e)
{
HttpContext context = HttpContext.Current;
string host = context.Request.Url.Host;
string owner = host.Substring(0, host.IndexOf('.'));
context.RewritePath(context.Request.RawUrl + "?owner=" + owner);
}
经过两次
URL Rewrite,已经实现了我们想要的效果(在实际项目中,上面的代码不
能直接使用,因为需要判断是否有
Query String 等等)。
此外,
ASP.NET 级别的 URL Rewrite 只能在 ASP.NET 里工作(显然的事情),如果
要让
URL Rewrite 支持 PHP,RoR 等其他服务器技术,就只能使用 IIS 级别的
URL Rewrite 了(或者其他服务器技术提供的 URL Rewrite 功能)。