郭樂明
(浙江農(nóng)業(yè)商貿(mào)職業(yè)學(xué)院,浙江 紹興 312000)
運(yùn)用ASP.NET進(jìn)行URL重寫的技術(shù)實(shí)現(xiàn)
郭樂明
(浙江農(nóng)業(yè)商貿(mào)職業(yè)學(xué)院,浙江 紹興 312000)
本文闡述了URL重寫(URL Rewriting)的用處:使URL簡(jiǎn)單易記;防止黑客攻擊;滿足搜索引擎需要;提高網(wǎng)站可移植性;防止盜鏈;使URL支持“可刪節(jié)”的需求.本文分析了ASP.NET實(shí)現(xiàn)URL重寫的機(jī)制,并重點(diǎn)論述了用ASP.NET進(jìn)行URL重寫的技術(shù)實(shí)現(xiàn).
ASP.NET;URL Rewriting;ISAPI;IIS;HTTP Module;HTTP Handler
URL重寫,實(shí)質(zhì)上是將網(wǎng)頁真實(shí)URL隱藏起來,使用戶通過相應(yīng)的虛擬URL(VirtualURL)訪問網(wǎng)頁資源,以便克服真實(shí)URL的許多不足.具體來講,URL重寫有以下幾點(diǎn)用處:
1.1 滿足搜索引擎需要,實(shí)現(xiàn)搜索引擎中排名優(yōu)化.目前很多搜索引擎不支持動(dòng)態(tài)鏈接,無法抓取動(dòng)態(tài)網(wǎng)頁,尤其是帶“?”查詢參數(shù)的網(wǎng)頁,使網(wǎng)站許多信息無法被用戶搜索到.即使搜索引擎支持動(dòng)態(tài)鏈接,比如Google,它抓取動(dòng)態(tài)網(wǎng)頁的優(yōu)先度也遠(yuǎn)遠(yuǎn)低于靜態(tài)網(wǎng)頁,這樣就使動(dòng)態(tài)網(wǎng)頁的排名遠(yuǎn)遠(yuǎn)落后于靜態(tài)網(wǎng)頁.而URL重寫很大程度上是用于將動(dòng)態(tài)鏈接轉(zhuǎn)換成靜態(tài)鏈接,這將使得搜索引擎盡可能深地抓取網(wǎng)站子欄目的內(nèi)容,使網(wǎng)頁在搜索結(jié)果中排名靠前.
1.2 隱藏網(wǎng)頁實(shí)現(xiàn)技術(shù),增強(qiáng)網(wǎng)站安全性.如果網(wǎng)頁上帶著像.jsp/.asp/.aspx這樣的擴(kuò)展名,讓人一看就知道網(wǎng)站是用什么技術(shù)實(shí)現(xiàn)的.但如果將http://server/test.aspx?id=3重寫成http://server/test/3.htm,使黑客無法知曉網(wǎng)頁的實(shí)現(xiàn)技術(shù),大大降低了網(wǎng)頁受攻擊的可能性.
1.3 提高網(wǎng)站的移植性.由于真實(shí)URL含有實(shí)現(xiàn)技術(shù)語言的后綴信息(如.aspx/.asp/.jsp),當(dāng)網(wǎng)站改變技術(shù)實(shí)現(xiàn)語言的時(shí)候,需要改動(dòng)大量的鏈接,比如從.net平臺(tái)的.aspx轉(zhuǎn)成java平臺(tái)的.jsp.而且,如果頁面修改了擴(kuò)展名,那么對(duì)于搜索
引擎而言就是一個(gè)新頁面,它原先在搜索引擎中的PageR-ank也會(huì)隨之消失,從頭開始排名.如果用URL重寫技術(shù)隱藏技術(shù)實(shí)現(xiàn)細(xì)節(jié),修改移植就會(huì)很方便,而且完全不損失PageRank.
1.4 防止盜鏈.所謂盜鏈,是指盜用其他網(wǎng)站上相應(yīng)資源的URL鏈接為自己網(wǎng)站所用.比如將別人網(wǎng)站上的圖片或聲音的URL寫入自己的網(wǎng)頁代碼,使用戶在訪問網(wǎng)站時(shí),能直接獲得被盜用網(wǎng)站的資源.如果一個(gè)網(wǎng)站的資源經(jīng)常被其他網(wǎng)站盜鏈,那么網(wǎng)站的性能將會(huì)大大下降.而如果將真實(shí)URL重寫成虛擬URL,甚至附帶強(qiáng)大的站外鏈接過濾功能,就可以防止盜鏈.
1.5 使URL簡(jiǎn)單易記,增加URL美感.比如可以把“http: //server/Detail.aspx?year=2009&month=12&day=30”重寫成“http: //server/2009/12/30/”,這樣,用戶可以相當(dāng)方便地訪問網(wǎng)站.
1.6 使URL支持“可刪節(jié)”的需求[1,2].“可刪節(jié)”是一種極其重要的用戶需求,通過URL重寫,可以實(shí)現(xiàn)這種需求.比如將上例“http://server/2009/12/30/”中的日期刪除,變成“http: //server/2009/12/”,能列出2009年12月的內(nèi)容;繼續(xù)刪除URL中的月份,變成“http://server/2009/”,能列出2009年的內(nèi)容等.
如圖1所示,當(dāng)IIS(Internet服務(wù)管理器)接收到一個(gè)Web請(qǐng)求時(shí),IIS 通過ISAPI篩選器(ISAPI Filter)檢查被請(qǐng)求文件的擴(kuò)展名以確定如何處理該請(qǐng)求.IIS可以自行處理靜態(tài)資源的請(qǐng)求(如HTML頁面、圖像),或者將請(qǐng)求傳遞到ISAPI擴(kuò)展(ISAPIExtension).比如asp文件使用asp.dll ISAPI擴(kuò)展.對(duì)于ASP.NET文件,IIS會(huì)將請(qǐng)求傳給aspnet_isapi.dll ISAPI擴(kuò)展.然后aspnet_isapi.dll將處理操作傳遞給托管的ASP.NET進(jìn)程(aspnet_wp.exe),該進(jìn)程讀取machine.config和web.config中配置的多個(gè)HTTP模塊(HTTP Module),用對(duì)應(yīng)的HTTP處理器(HTTP Handler)處理請(qǐng)求,并將處理結(jié)果(如由ASP.NET網(wǎng)頁生成的HTML代碼)返回給客戶端.[2,3]
由圖1可見,實(shí)現(xiàn)URL重寫的關(guān)鍵是ISAPI:ISAPI Filter和ISAPI Extension,但是,ISAPI的開發(fā)和部署比較困難,在ISAPIFilter上實(shí)現(xiàn)URL重寫難度比較大.由于ASP. NET引擎與IIS非常相似[2],所以可以利用ASP.NET的HTTP Module或HTTP Handler實(shí)現(xiàn)URL重寫.其中,HTTP Module實(shí)現(xiàn)了類似于ISAPI Filter的功能,HTTP Handler實(shí)現(xiàn)了類似于ISAPI Extension的功能.
為了實(shí)現(xiàn)URL重寫,ASP.NET需要?jiǎng)?chuàng)建和注冊(cè)自定義HTTP Module或HTTP Handler,以便完成以下操作[2]:
(1)檢查被請(qǐng)求的路徑,以確定URL是否需要重寫.
(2)如果URL需要重寫,可以調(diào)用System.Web.Http-Context類的RewritePath()方法來重寫路徑.
3.1 為URL重寫指定配置信息.在創(chuàng)建自定義HTTP Module或HTTP Handler之前,必須在machine.config(影響整個(gè)Web服務(wù)器)或web.config(針對(duì)特定的Web應(yīng)用程序)的configuration/system.web 部分設(shè)置配置信息[5]:
或者:
3.2 編寫URL重寫規(guī)則.為了能使URL正確被重寫,需要在web.config或其他文件中編寫URL重寫規(guī)則,以便確定需要重寫的URL地址和URL轉(zhuǎn)發(fā)的地址.一般使用可以序列化(Serializable)的結(jié)構(gòu):
3.3 選擇合適的URL重寫時(shí)機(jī).由于ASP.NET不同的身份驗(yàn)證(Authorize)和文件授權(quán)方式(Authenticate)會(huì)對(duì)URL重寫產(chǎn)生影響[2],所以應(yīng)選擇Global.asax文件中合適的事件來執(zhí)行URL重寫.
如果使用Windows身份驗(yàn)證和文件授權(quán)方式,則最好使用HTTP Module進(jìn)行URL重寫,而且必須由BeginRequest事件或AuthenticateRequest事件執(zhí)行URL重寫.對(duì)于窗體(Forms)驗(yàn)證,HTTP Module最好是由AuthorizeRequest事件執(zhí)行重寫.[2,7]
3.4 自定義URL重寫方法.以HTTP Module為例:
URLRules rules=…… //用自定義的URLRules類獲得3.2節(jié)的URL重寫規(guī)則
//用自定義的Helper.Resolve方法將rules[i].Url轉(zhuǎn)換為相應(yīng)的目錄
則,則進(jìn)行相應(yīng)替換
3.5 在Global.asax相應(yīng)事件中執(zhí)行自定義的URL重寫方法.例如:
本文詳細(xì)闡述了URL重寫的用處.實(shí)現(xiàn)機(jī)制和方法. URL重寫之所以能在ASP.NET上實(shí)現(xiàn),關(guān)鍵在于能利用ASP.NET的HttpContext類RewritePath()方法來重寫路徑,而無須改動(dòng)復(fù)雜的ISAPI.然而,上述方法只針對(duì)一些擴(kuò)展名的URL重寫,如果要想處理所有文件類型的URL重寫,甚至控制靜態(tài)文件類型,則需要在上述基礎(chǔ)上更為復(fù)雜的技術(shù)設(shè)置.
〔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處理及其應(yīng)用[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