郭樂明
(浙江農業商貿職業學院,浙江 紹興 312000)
運用ASP.NET進行URL重寫的技術實現
郭樂明
(浙江農業商貿職業學院,浙江 紹興 312000)
本文闡述了URL重寫(URL Rewriting)的用處:使URL簡單易記;防止黑客攻擊;滿足搜索引擎需要;提高網站可移植性;防止盜鏈;使URL支持“可刪節”的需求.本文分析了ASP.NET實現URL重寫的機制,并重點論述了用ASP.NET進行URL重寫的技術實現.
ASP.NET;URL Rewriting;ISAPI;IIS;HTTP Module;HTTP Handler
URL重寫,實質上是將網頁真實URL隱藏起來,使用戶通過相應的虛擬URL(VirtualURL)訪問網頁資源,以便克服真實URL的許多不足.具體來講,URL重寫有以下幾點用處:
1.1 滿足搜索引擎需要,實現搜索引擎中排名優化.目前很多搜索引擎不支持動態鏈接,無法抓取動態網頁,尤其是帶“?”查詢參數的網頁,使網站許多信息無法被用戶搜索到.即使搜索引擎支持動態鏈接,比如Google,它抓取動態網頁的優先度也遠遠低于靜態網頁,這樣就使動態網頁的排名遠遠落后于靜態網頁.而URL重寫很大程度上是用于將動態鏈接轉換成靜態鏈接,這將使得搜索引擎盡可能深地抓取網站子欄目的內容,使網頁在搜索結果中排名靠前.
1.2 隱藏網頁實現技術,增強網站安全性.如果網頁上帶著像.jsp/.asp/.aspx這樣的擴展名,讓人一看就知道網站是用什么技術實現的.但如果將http://server/test.aspx?id=3重寫成http://server/test/3.htm,使黑客無法知曉網頁的實現技術,大大降低了網頁受攻擊的可能性.
1.3 提高網站的移植性.由于真實URL含有實現技術語言的后綴信息(如.aspx/.asp/.jsp),當網站改變技術實現語言的時候,需要改動大量的鏈接,比如從.net平臺的.aspx轉成java平臺的.jsp.而且,如果頁面修改了擴展名,那么對于搜索
引擎而言就是一個新頁面,它原先在搜索引擎中的PageR-ank也會隨之消失,從頭開始排名.如果用URL重寫技術隱藏技術實現細節,修改移植就會很方便,而且完全不損失PageRank.
1.4 防止盜鏈.所謂盜鏈,是指盜用其他網站上相應資源的URL鏈接為自己網站所用.比如將別人網站上的圖片或聲音的URL寫入自己的網頁代碼,使用戶在訪問網站時,能直接獲得被盜用網站的資源.如果一個網站的資源經常被其他網站盜鏈,那么網站的性能將會大大下降.而如果將真實URL重寫成虛擬URL,甚至附帶強大的站外鏈接過濾功能,就可以防止盜鏈.
1.5 使URL簡單易記,增加URL美感.比如可以把“http: //server/Detail.aspx?year=2009&month=12&day=30”重寫成“http: //server/2009/12/30/”,這樣,用戶可以相當方便地訪問網站.
1.6 使URL支持“可刪節”的需求[1,2].“可刪節”是一種極其重要的用戶需求,通過URL重寫,可以實現這種需求.比如將上例“http://server/2009/12/30/”中的日期刪除,變成“http: //server/2009/12/”,能列出2009年12月的內容;繼續刪除URL中的月份,變成“http://server/2009/”,能列出2009年的內容等.

如圖1所示,當IIS(Internet服務管理器)接收到一個Web請求時,IIS 通過ISAPI篩選器(ISAPI Filter)檢查被請求文件的擴展名以確定如何處理該請求.IIS可以自行處理靜態資源的請求(如HTML頁面、圖像),或者將請求傳遞到ISAPI擴展(ISAPIExtension).比如asp文件使用asp.dll ISAPI擴展.對于ASP.NET文件,IIS會將請求傳給aspnet_isapi.dll ISAPI擴展.然后aspnet_isapi.dll將處理操作傳遞給托管的ASP.NET進程(aspnet_wp.exe),該進程讀取machine.config和web.config中配置的多個HTTP模塊(HTTP Module),用對應的HTTP處理器(HTTP Handler)處理請求,并將處理結果(如由ASP.NET網頁生成的HTML代碼)返回給客戶端.[2,3]
由圖1可見,實現URL重寫的關鍵是ISAPI:ISAPI Filter和ISAPI Extension,但是,ISAPI的開發和部署比較困難,在ISAPIFilter上實現URL重寫難度比較大.由于ASP. NET引擎與IIS非常相似[2],所以可以利用ASP.NET的HTTP Module或HTTP Handler實現URL重寫.其中,HTTP Module實現了類似于ISAPI Filter的功能,HTTP Handler實現了類似于ISAPI Extension的功能.
為了實現URL重寫,ASP.NET需要創建和注冊自定義HTTP Module或HTTP Handler,以便完成以下操作[2]:
(1)檢查被請求的路徑,以確定URL是否需要重寫.
(2)如果URL需要重寫,可以調用System.Web.Http-Context類的RewritePath()方法來重寫路徑.
3.1 為URL重寫指定配置信息.在創建自定義HTTP Module或HTTP Handler之前,必須在machine.config(影響整個Web服務器)或web.config(針對特定的Web應用程序)的configuration/system.web 部分設置配置信息[5]:


或者:

3.2 編寫URL重寫規則.為了能使URL正確被重寫,需要在web.config或其他文件中編寫URL重寫規則,以便確定需要重寫的URL地址和URL轉發的地址.一般使用可以序列化(Serializable)的結構:

3.3 選擇合適的URL重寫時機.由于ASP.NET不同的身份驗證(Authorize)和文件授權方式(Authenticate)會對URL重寫產生影響[2],所以應選擇Global.asax文件中合適的事件來執行URL重寫.
如果使用Windows身份驗證和文件授權方式,則最好使用HTTP Module進行URL重寫,而且必須由BeginRequest事件或AuthenticateRequest事件執行URL重寫.對于窗體(Forms)驗證,HTTP Module最好是由AuthorizeRequest事件執行重寫.[2,7]
3.4 自定義URL重寫方法.以HTTP Module為例:

URLRules rules=…… //用自定義的URLRules類獲得3.2節的URL重寫規則

//用自定義的Helper.Resolve方法將rules[i].Url轉換為相應的目錄

則,則進行相應替換

3.5 在Global.asax相應事件中執行自定義的URL重寫方法.例如:

本文詳細闡述了URL重寫的用處.實現機制和方法. URL重寫之所以能在ASP.NET上實現,關鍵在于能利用ASP.NET的HttpContext類RewritePath()方法來重寫路徑,而無須改動復雜的ISAPI.然而,上述方法只針對一些擴展名的URL重寫,如果要想處理所有文件類型的URL重寫,甚至控制靜態文件類型,則需要在上述基礎上更為復雜的技術設置.
〔1〕Jakob Nielsen.URL asUI[DB/OL].http://www.useit. com/alertbox/990321.html.
〔2〕Scott Mitchell.URL Rewriting in ASP.NET[DB/OL].http://msdn.microsoft.com/library/default.asp?url=/library/enus/dnaspp/html/urlrewriting.asp.
〔3〕Michele Leroux Bustamante.Inside IIS&ASP.NET[DB/ OL].http://www.theserverside.net/articles/showarticle.tss? id=IIS_ASP.
〔4〕孫亞民.ASP.Net中自定義Http處理及其應用[DB/OL]. http://www.uml.org.cn/
〔5〕Microsoft.http://msdn.microsoft.com/library/
〔6〕Mansoor Ahmed Siddiqui.HTTP Handlers and HTTP Modulesin ASP.NET[DB/OL].http://www.15seconds. com/issue/020417.htm
〔7〕Richard Birkby.URL Rewriting with ASP.NET[DB/OL].http://www.codeproject.com/aspnet/URLRewriter.asp.
TP393.092
A
1673-260X(2010)05-0019-02