現在第一篇,討論我的網站之中使用的URL重寫技術,實際上,該技術並不是我編寫的,可能有用戶能夠記得,我的網站www.step1.cn原來就是一個博客,那個時候采用的系統是博客園提供的cnblogs程序(我將這個程序改裝成能夠在當時的虛擬主機上運行,可花了不少功夫),後來我將博客遷到這裡之後,對Step1.cn進行大的改版,當時我實在捨不得這套博客程序之中使用的URL重寫的技術,因此專門的從那個cnblogs程序之中將相關的代碼從其中拆分出來成一個DLL類,在我的網站使用URL重寫技術。
當時由於cnblogs.cn這個程序結構相當優秀,所以我更改的並不多,主要有以下幾點:
1.基於404錯誤的URL重寫技術。因為有的虛擬主機並不支持URL重寫技術,尤其是你要對靜態的HTML文件進行URL重寫(當然我並沒有使用這個技術),可是基本上沒有虛擬主機支持對靜態的HTML文件進行URL重寫(至少我沒有用過),於是我想到了一個變通的方法,那就是修改服務器的404錯誤頁面的設置,將該設置指向到一個特定的ASPX文件,再在ASPX文件之中調用cnblogs的URL重寫程序。
Error404.aspx的對應類代碼:
1 public class Error404 : System.Web.UI.Page
2 {
3 private void Page_Load(object sender, System.EventArgs e)
4 {
5 if(Request.QueryString!=null)
6 {
7 string[] queryString=Request.RawUrl.Substring(Request.RawUrl.IndexOf("?")+1).Split(new char[]{';'});
8 if(queryString.Length==2 && queryString[0]=="404")
9 {
10 Uri uri=new Uri(queryString[1]);
11 string query=uri.Query;
12 if(query.StartsWith("?"))
13 query=query.Substring(1);
14 this.Context.RewritePath(uri.AbsolutePath,uri.UserInfo,query);
15 (new UrlReWriteHandlerFactory()).GetHandler(this.Context,Request.RequestType,uri.PathAndQuery,Server.MapPath(uri.LocalPath)).ProcessRequest(this.Context);
16 this.Context.Response.End();
17 }
18 }
19 }
20 }
我剛才看了一下,剩下的代碼由於大部分摘自cnblogs的源碼,而我更改的部分都很小,因此我不在本文之中提供源碼,如果確有需要,可以首先去參考cnblogs的源碼,也可以發郵件向我索取該部分的源碼,我可以直接提供。
總體上來講,該URL重寫機制,通過在Web.Config文件之中添加類似於如下的配置來實現對應的URL重寫的功能:
1<HttpHandlerpattern="^/place/cn/([%0-9a-zA-Z/]*).aspx$"type="Step1.UrlRewriter.PageHandlerFactory,Step1.UrlRewriter"handlerType="Redirect"pageLocation="/place/Place.aspx?p=$1"/>
2
以上的配置,會將網址/place/cn/aaaaaaa.aspx自動在服務端轉向到/place/Place.aspx?p=aaaaaaa
詳細的內容,可能我在後面講解其他的技術的時候會重新提到。