網路上看到,很多朋友在asp.net做urlrewrite,用的是HttpHandle+Server.Transfer的方法。其實這種方法是錯的。第一,HttpHandle是實現不了urlrewrite的;第二Server.Transfer是標準的重定向,根本不是urlrewrite。
其實,實作urlrewrite不用自己HttpHandle,也不用自己實作HttpModule,用幾行程式碼就可以輕鬆實現。
我這裡介紹的是在虛擬主機上,虛擬主機不同於自己的伺服器,你是沒有權限去修改iis,也沒有權限去安裝iis rewrite之類的iis插件。但我們仍然可以輕鬆完成需要的功能。
具體做法如下:開啟global.asax.cs,定位到protected void Application_BeginRequest(Object sender, EventArgs e)。從方法名我想也能猜到它是做什麼的。輸入如下程式碼:
protected void Application_BeginRequest(Object sender, EventArgs e)
{
string oldUrl = HttpContext.Current.Request.RawUrl ;
string pattern = @"^(.+)default/(d+).aspx(?.*)*$";
string replace = "$1default.aspx?id=$2";
if(Regex.IsMatch(oldUrl, pattern, RegexOptions.IgnoreCase | RegexOptions.Compiled))
{
string newUrl = Regex.Replace(oldUrl, pattern, replace, RegexOptions.Compiled | RegexOptions.IgnoreCase);
this.Context.RewritePath(newUrl);
}
}
有了上邊這段程式碼,我訪問一個類似:.../default/123.aspx 的網址,當然這個網址在我的電腦上不存在,它就會被導向到:.../default.aspx? id=123。
當然,利用功能強大的正規表示式,你可以任意按照自己的需求來重寫url,這一切都是在伺服器端默默的進行,在客戶端是不會有任何察覺的。由於是在虛擬主機上,我們只能重定向.aspx文件,如果是自己的伺服器,只要把後綴名在iis中註冊一下,就可以實現任意後綴名的處理。例如你可以註冊一個*.myweb這樣的類型,這樣別人造訪default/456.myweb時,你可以把它重新導向到default.aspx?id=456。總之一句話,只要你能想到,.net就可以幫你實現,而這一切不需要多少的程式碼。