重提URL Rewrite(4):不同級別URL Rewrite的一些細節與特點

作者: Jeffrey Zhao  來源: 博客園  發布時間: 2009-01-13 10:40  閱讀: 4289 次  推薦: 0   原文鏈接   [收藏]  
 
摘要:不同級別URL Rewrite的一些細節與特點
[1] 對URL Rewrite功能上的要求
[2] 對URL中特殊字符的處理
[3] 出錯頁面配置

  在之前的文章里我們已經談論了有關URL Rewrite的幾個主要的方面。在本系列的最后一篇文章中,我們就來討論一下有關不同級別URL Rewrite的一些細節與特點。

  理論上說,IIS級別的URL Rewrite使用C或C++編寫,比使用托管代碼編寫的ASP.NET級別URL Rewrite性能要高。但是我認為這方面的差距在大部分情況下可以忽略不計,這種性能幾乎不可能成為性能瓶頸。因此選擇何種級別的URL Rewrite一般不會由您應用程序的性能要求來決定。那么到底應該使用哪種級別的URL Rewrite呢?在使用不同級別的URL Rewrite之后,我們又該注意點什么呢?我在這里談談我個人的看法。

對URL Rewrite功能上的要求

  雖說目前的URL Rewrite組件在功能上已經能夠滿足大部分的應用,但是在某些時候,我們的確還是會需要一些特殊的功能。例如根據域名進行URL Rewrite,就目前的URL Rewrite組件來說,想要實現這個并不容易。商業化的ISAPI Rewrite目前已經可以支持這一點,可惜開源的UrlRewriter.NET和IIRF在這方面功能都有所不足。它們都是根據請求相對于該站點的路徑來匹配,至于請求的是哪個域名并不能作為匹配條件來使用。這就要求我們對URL Rewrite組件進行擴展。對于大部分.NET開發人員來說,托管代碼自然是開發首選,這時可能就要選擇ASP.NET級別的URL Rewrite重寫組件了。不過目前網上能找到不少擴展的例子,無論是ASP.NET級別的UrlRewriter.NET還是IIS級別的IIRF。

  不過事實上,如果要實現上述功能,我們也可以分兩步進行。首先我們在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功能)。

 

0
0
 
標簽:ASP.NET
 
 

文章列表

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()