[转]URLRewrite隐藏.aspx后缀名的应用(转载+延伸)
本文轉(zhuǎn)自:http://www.cnblogs.com/showker/archive/2010/01/11/1644062.html
前言:為什么轉(zhuǎn)載這篇文章?因?yàn)樗兴伎加袑?shí)踐。最近因?yàn)闃I(yè)務(wù)的需要,要對(duì)Url進(jìn)行重寫,其實(shí)也不是重寫,也就是像在php中非常容易實(shí)現(xiàn)的隱藏.php后綴一樣來隱藏.aspx后綴。搜索不少文章,都提到URL重寫,但是對(duì)于如何隱藏.aspx后綴描述不清。經(jīng)過不懈搜索搜到這篇文章,按照其步驟,實(shí)現(xiàn)了如test.aspx,直接用test訪問.我實(shí)踐后想說的,實(shí)現(xiàn)隱藏.aspx,必須要在IIS里配置.*的隱射。而且伴隨在IIS中配置了.*的隱射后會(huì)帶來一系列問題。我目前碰到的有
0、在IIS中配置好.*的隱射后,還必須在handler中配置
???<add verb="*" path="*" type="URLRewriter.RewriterFactoryHandler, URLRewriter" />
否則會(huì)出現(xiàn)404錯(cuò)誤
1、默認(rèn)文檔無(wú)效的問題。比如輸入http://192.168.1.1/提示找不到"/",按理應(yīng)該跳轉(zhuǎn)到默認(rèn)文檔比如index.html。這時(shí)我們需要在規(guī)則里添加
???<!--因handlers的原因?qū)е履J(rèn)文檔失效如http://localhost/到不了index.html)-->
???<RewriterRule>
????<LookFor>~(/?)$</LookFor>
????<SendTo>~/index.html</SendTo>
???</RewriterRule>
2、html文件無(wú)法打開的問題。這個(gè)網(wǎng)上有網(wǎng)友碰到過,解決方法是
<compilation debug="true" >
????? <!-- 加上此節(jié)點(diǎn),保證原本就是.html類型的文件能正常訪問 -->
<buildProviders>
<add extension=".html" type="System.Web.Compilation.PageBuildProvider" />
</buildProviders>?
???? </compilation>
附件是我現(xiàn)在實(shí)現(xiàn)了無(wú)后綴名的web.config文件及使用的urlrewritting的dll,供大家參考。
轉(zhuǎn)載開始
學(xué)習(xí)正則表達(dá)式 小有一段時(shí)間了,但就現(xiàn)在的應(yīng)用情況來看,還是處于初級(jí)的基礎(chǔ)應(yīng)用水平,通過簡(jiǎn)單的使用正則,我覺得每當(dāng)有一個(gè)新問題、一種新需求出現(xiàn)時(shí),都需要考慮在正 則如何實(shí)現(xiàn)的范圍內(nèi),正則的格式或?qū)崿F(xiàn)方法可能都會(huì)需要靈活的變化,因?yàn)樵谡齽t的使用上有可能需要考慮地域、文化、甚至是國(guó)際條例等等當(dāng)然這是個(gè)特例,所以在設(shè)計(jì)正則表達(dá)式前,是需要盡可能的分析好要匹配或是處理的項(xiàng),以便在之后的實(shí)際應(yīng)用中不會(huì)因?yàn)橐粋€(gè)類似項(xiàng)的出現(xiàn)而無(wú)法實(shí)現(xiàn)原有的需求匹配、替換),同時(shí),一個(gè)設(shè)計(jì)很好的表達(dá)式在可讀性,甚至是效率上都會(huì)明顯的區(qū)別與設(shè)計(jì)過于復(fù)雜、而實(shí)現(xiàn)方式又不好的那些。所以從分析需求、應(yīng)用語(yǔ)法,到測(cè)試正則,這是基本的正則實(shí)現(xiàn)方法。
?
?
??? 由于正則的簡(jiǎn)要的語(yǔ)法和相關(guān)事項(xiàng)在網(wǎng)絡(luò)上都有詳細(xì)的說明,這里不在贅述,下面我通過結(jié)合個(gè)人的實(shí)際應(yīng)用,來簡(jiǎn)單的說明它的應(yīng)用,當(dāng)然涉及的正則式可能在某些地方也很是不足,但能得到大家的意見、指導(dǎo)……也對(duì)我以后的學(xué)習(xí)會(huì)有良好的推動(dòng)作用:)。參閱下面下述文檔前,如果還有時(shí)間,建議可以先看下Microsoft網(wǎng)站的一篇文章,因?yàn)樵诒硎錾鲜峭ㄟ^一個(gè)系統(tǒng)的功能實(shí)現(xiàn)來進(jìn)行的,且涉及URLRewriting。《URLRewriteing的實(shí)現(xiàn)方法》
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnaspp/html/urlrewriting.asp
一、?????????? 實(shí)現(xiàn)URLRewrite的方法
URLRewrite的實(shí)現(xiàn),如果看過Microsoft的文章,則可以大致的了解其實(shí)現(xiàn)原理,然而它的實(shí)現(xiàn)方法也不僅僅是文中所提到的。?
以下為個(gè)人在實(shí)際應(yīng)用中實(shí)現(xiàn)URLRewrite的方法:
1、應(yīng)用IIS進(jìn)行配置(IIS5.0):
?????? 在IIS中找到應(yīng)用程序站點(diǎn)或程序?qū)?yīng)的虛擬目錄,右擊/屬性/目錄/應(yīng)用程序配置/配置/應(yīng)用程序映射選項(xiàng)/,然后選擇添加映射,在可執(zhí)行文件框中瀏覽aspnet_isapi.dll文件(一般為C:\WINNT\Microsoft.NET\Framework\v1.1.4322\aspnet_isapi.dll),擴(kuò)展名輸入.*(如果針對(duì).html的可直接輸入單個(gè)擴(kuò)展即可),動(dòng)作設(shè)為“POST,GET”(為減少不必要的資源耗費(fèi),不用設(shè)置為全部動(dòng)作),其他的默認(rèn)即可。之所以這樣做,是要把請(qǐng)求判斷權(quán)交給ASPNET處理,而不是IIS去刷選,所以這個(gè)映射是必要的。完成這里的操作后,繼續(xù)……
?????? 由于用戶請(qǐng)求連接時(shí)Application_BeginRequest()函數(shù)會(huì)被觸發(fā),所以只需要在這里判斷客戶端提交的請(qǐng)求就可以了,這就正是上面將IIS篩選權(quán)給ASPNET的原因所在。
?
2、要實(shí)現(xiàn)的需求情況:
?????? ?????? ??? 需求信息:
1、?處理靜態(tài)頁(yè)面.HTML到.ASPX頁(yè)面的映射
2、?實(shí)現(xiàn)按照2006/8/4(/)或2006/08/06(/)形式訪問站點(diǎn)時(shí),訪問到諸如.aspx?log_Year=2006&log_Month=8&log_Day=4的請(qǐng)求頁(yè)面
3、?2006/到.aspx? log_Year=2006的映射
4、?2006/8(/)或2006/08(/)到.aspx? log_Year=2006&log_Month=8的映射
5、?同步需要處理圖片、CSS、驗(yàn)證碼路徑的映射
6、?系統(tǒng)文章訪問按照“L數(shù)字.html”形式訪問,映射.aspx?logID=數(shù)字
7、?文章分類按照“C數(shù)字.html”形式訪問,映射.aspx?cateID=數(shù)字
8、?編輯文章時(shí)按照“E數(shù)字.html”形式訪問,映射.aspx?edit=數(shù)字
9、?……
3、實(shí)現(xiàn)方式:
?????? 有兩種方式通過正則進(jìn)行處理,一方面可以直接在后臺(tái)類代碼里寫正則匹配,還可以將編寫的正則放入指定的外部文件中進(jìn)行調(diào)用分析,諸如“Rewrite.config”。
?????? 在第一種方法實(shí)現(xiàn)時(shí),可以在Application_BeginRequest()觸發(fā)時(shí)進(jìn)行判斷處理,可改為任何所需要的訪問方式,無(wú)需第三方DLL的支持。
?
??????? 4、匹配語(yǔ)法&實(shí)現(xiàn):
?
????????????string?strNewUrl;//存放處理后的轉(zhuǎn)向URL信息
????????/**//*這里只給一個(gè)示范,其他需求的實(shí)現(xiàn)類似,只需要更改對(duì)應(yīng)的正則式,在下面的方法中將詳細(xì)的說明其實(shí)現(xiàn)*/
????????????if?(Regex.IsMatch(strRawUrl,?@"(w+).html",?RegexOptions.IgnoreCase))
????????????{
????????????????strNewUrl?=?Regex.Replace(strRawUrl,?@"(w+).html",?@"$1.aspx",?RegexOptions.IgnoreCase);
????????????????HttpContext.Current.RewritePath(?strNewUrl?);
????????????}????????????
????????/**//*處理圖片、樣式表、驗(yàn)證碼路徑類似……*/
?
第二種方法則是通過讀取、分析外部配置文件,從而獲得正則處理的輸入和格式串等信息,當(dāng)然這里也可以直接在默認(rèn)的Web.config文件里寫,我將它放到了單獨(dú)的Rewrite.config文件里,格式如下:?
????<?xml?version="1.0"?encoding="utf8"??>?<RewriterConfig>
????<Rules>????
????????<RewriterRule><!--基本的靜態(tài)頁(yè)面訪問?default.html?blogpost.html-->
????????????<LookFor>(w+).html</LookFor>
????????????<SendTo>$1.aspx</SendTo>
????</RewriterRule>????
/*其他的匹配類似?*/
????</Rules>
</RewriterConfig>
?上面的需求可能比較簡(jiǎn)單,不是需要編寫大段的正則代碼,所以在邏輯上只要一步一步的設(shè)計(jì)下去即可。
(1)、從HTML到ASPX的映射,這個(gè)比較簡(jiǎn)單,只是需要將.HTML的后綴映射為ASPX即可。
?
????????<RewriterRule><!--基本的靜態(tài)頁(yè)面訪問?default.html?blogpost.html-->????????????<LookFor>(w+).html</LookFor>
????????????<SendTo>$1.aspx</SendTo>
??????</RewriterRule>
?
上面的()號(hào),表示一個(gè)捕獲組,匹配的字符作為最終匹配的部分
?????? ???????? (2)、2006/8/4(/)或2006/08/06(/)形式訪問站點(diǎn)時(shí),映射為
.aspx?log_Year=2006&log_Month=8&log_Day=4的請(qǐng)求
?????? 這里的實(shí)現(xiàn)和上面一樣,需要匹配特定的symbol(數(shù)字、符號(hào)),這里有兩種情況需要考慮在內(nèi)月份和具體的天,有可能是單個(gè)數(shù)字,也可能是兩個(gè)數(shù)字組成,所以利用簡(jiǎn)單的匹配項(xiàng),構(gòu)建如下:
?????? (\d{4})/(\d{1,2})/(\d{1,2})(/?)$
???????? {1,2}表示了匹配前面的內(nèi)容項(xiàng)時(shí),該項(xiàng)是1到2個(gè)元素組成,$字符指示了至此該匹配串結(jié)束,后面不會(huì)有其他任何字符元素,同上,()組將作為最終輸出的匹配項(xiàng)。
???????? 傳遞匹配值如下:
?????????????????? default.aspx?log_Year=$1&log_Month=$2&log_Day=$3
?????????????????? //\d表示的是0—9的數(shù)字,{4}表示前匹配項(xiàng)有4個(gè)元素
?????????????????? // /?表示“/”字符可有可無(wú),?則表示前面匹配項(xiàng)為1次或0次出現(xiàn)
???????? //&表示的是實(shí)際要用的“&”字符,它作為URL參數(shù)的連接項(xiàng),在這里需要進(jìn)行轉(zhuǎn)換,否則讀取時(shí)將會(huì)出錯(cuò)。
?
?????? (3)、2006/到.aspx? log_Year=2006的映射
????????????? ?實(shí)現(xiàn)方式如上,(\d{4})/(\d{1,2})(/?)$
?????? (4)、同步需要處理圖片、CSS、驗(yàn)證碼的相對(duì)路徑問題
由于在表達(dá)式匹配后,相對(duì)的圖片、CSS,甚至動(dòng)態(tài)生成的圖片驗(yàn)證碼都將不會(huì)正常顯示,因?yàn)槠ヅ鋵⑻鎿Q頁(yè)面的默認(rèn)路徑,比如輸入2006/來訪問時(shí),圖片的相對(duì)路徑也將變?yōu)?/span>http://www.XXX.cn/blog/2006/images/…….gif,而不是原來的http://www.XXX.cn/blog/images/…….gif,所以要去實(shí)現(xiàn)這樣的轉(zhuǎn)換,為減少正則的復(fù)雜性,我將各種情況進(jìn)行了單獨(dú)處理,
????????????? 2006/images :(\d{4})/([images|styles]+)/(.+)
?????? ?????? 引用:$2/$3
???????? 中間的“[images|styles]”表示沒有用通用的字符去匹配,因?yàn)檫€可能有其他的類似目錄,為防止替換,這里我是這樣限制的,“(.+)”這里表示的是只要包含前面的images|styles路徑信息則都會(huì)匹配的,而不看它后面的串信息。
?
?????????????????? 2006/6/19/images: (\d{4})/(\d{1,2})/(\d{1,2})(/?)([images|styles]+)/(.+)
?????????????????? 引用: $5/$6
?????????????????? 同上
?????????????????? 2006/6/images: (\d{4})/(\d{1,2})/([images|styles]+)/(.+)
?????????????????? 引用: $3/$4
????????????? 同上
?
?????? (5)、系統(tǒng)文章瀏覽按照“L數(shù)字.html”形式,文章分類列表信息按照“C數(shù)字.html”訪
問,編輯文章時(shí)按照“E數(shù)字.html”訪問……等,???? 這里和上面的靜態(tài)頁(yè)面匹配是同用的。
首先看文章瀏覽“L數(shù)字.html”,這里的HTML會(huì)被自動(dòng)的匹配為ASPX,而“數(shù)字”也將會(huì)被匹配,并進(jìn)行處理映射處理。如下:
?
????<LookFor>/(d{4})?/?(d{1,2})?/?(d{1,2})?/?log(d+).html</LookFor>????<SendTo>/blogview.aspx?logID=$4&page=1</SendTo>
?
?????? 由上面的幾種情況在分開處理時(shí)是較為簡(jiǎn)單的,當(dāng)然還可以將它們放到一個(gè)表達(dá)式中進(jìn)行匹配處理,這在實(shí)現(xiàn)上相對(duì)復(fù)雜了一些,之前也沒有時(shí)間去檢查、修改,所以有興趣的朋友可以思考下哦J。
?
?????? 在實(shí)現(xiàn)上述正則的編寫后,需要在后臺(tái)類里進(jìn)行處理(提取、正則匹配),和第一種方式相同,在應(yīng)用程序開始請(qǐng)求的時(shí)候處理,Application_BeginRequest編碼如下:
?
????????????????string?path=Server.MapPath("~/Rewrite.config");?//外部正則存放路徑????????????????XPathDocument?myXPathDocument?=?new?XPathDocument(path);
????????????????XPathNavigator?myXPathNavigator?=?myXPathDocument.CreateNavigator();
XPathNodeIterator?myXPathNodeIterator?=??myXPathNavigator.Select?("//RewriterRule");
????????????????while?(myXPathNodeIterator.MoveNext())
????????????????{
????????????????????//循環(huán)遍歷Rewrite文件里的所有節(jié)點(diǎn)信息,對(duì)單條匹配規(guī)則也逐條處理(略)
????????????????????//獲取LookFor、SendTo后,傳遞給后臺(tái)正則需要匹配的串、格式等
????????????????????//同時(shí)重寫路徑信息
strNewUrl?=?Regex.Replace(strRawUrl,oldString,newString,RegexOptions.IgnoreCase);
????????????????HttpContext.Current.RewritePath(?strNewUrl?);
???????????????????}
?
上面簡(jiǎn)單的說明了正則的一個(gè)實(shí)際應(yīng)用的例子,實(shí)現(xiàn)的并不是復(fù)雜,關(guān)鍵是寫正則前的分析與多種情況的考慮,限于篇幅,下面給出分布實(shí)現(xiàn)的幾個(gè)方面,如下:
?
<?xml?version="1.0"?encoding="utf-8"??><RewriterConfig>
????<Rules>????
????????<RewriterRule><!--基本的靜態(tài)頁(yè)面訪問?default.html?blogpost.html-->
????????????<LookFor>(w+).html</LookFor>
????????????<SendTo>$1.aspx</SendTo>
????????</RewriterRule>????????????????????????????
????????<!--====以下格式不能合并完成,因?yàn)椴煌?qǐng)求不同路徑===-->
????????<RewriterRule><!--2006/6/19的格式訪問2006/6/19(/?)-->
????????????<LookFor>(d{4})/(d{1,2})/(d{1,2})(/?)$</LookFor>
????????????<SendTo>default.aspx?log_Year=$1&log_Month=$2&log_Day=$3</SendTo>
????????</RewriterRule>
????????<RewriterRule><!--重寫圖片和樣式表路徑2006/6/19/images-->
????????????<LookFor>(d{4})/(d{1,2})/(d{1,2})(/?)([images|styles]+)/(.+)</LookFor>
????????????<SendTo>$5/$6</SendTo>
????????</RewriterRule>????????
????????<RewriterRule><!--重寫驗(yàn)證碼路徑2006/6/19/checkcode.aspx-->
????????????<LookFor>(d{4})/(d{1,2})/(d{1,2})(/?)checkcode.aspx</LookFor>
????????????<SendTo>checkcode.aspx</SendTo>
????????</RewriterRule>????????
????????<RewriterRule><!--重寫通過2006/6/19訪問后?2006/6/19/blogview.aspx?logID=……等-->
????????????<LookFor>(d{4})/(d{1,2})/(d{1,2})(/?)(w+).aspx</LookFor>
????????????<SendTo>$5.aspx</SendTo>
????????</RewriterRule>????????????????????????????????????????
????????<!--============================================-->
????????<!--只請(qǐng)求blog目錄時(shí)的處理,交給ASPNET處理,默認(rèn)文件不能訪問的處理-->
????????<!--http://www.mcan.cn/blog(/)-->
????????<RewriterRule><!--blog/?or?blog?-->
????????????<LookFor>(.*)/blog(/?)$</LookFor>
????????????<SendTo>$1/blog/default.aspx</SendTo>
????????</RewriterRule>????????
????????<RewriterRule>
????????????<LookFor>^(/?)images/(.+)</LookFor>
????????????<SendTo>/blog/images/$2</SendTo>
????????</RewriterRule>????????
????????<!--============================================-->????????????????
????????<RewriterRule><!--分類訪問-->
????????????<LookFor>/(d{4})?/?(d{1,2})?/?(d{1,2})?/?c(d+).html</LookFor>
????????????<SendTo>/default.aspx?cateID=$4</SendTo>
????????</RewriterRule>????????????
????????<RewriterRule><!--單個(gè)日志訪問-->
????????????<LookFor>/(d{4})?/?(d{1,2})?/?(d{1,2})?/?log(d+).html</LookFor>
????????????<SendTo>/blogview.aspx?logID=$4&page=1</SendTo>
????????</RewriterRule>????????????
????????<RewriterRule><!--2006/6/6/default.html?類似的形式?非c2、log2、edit2等-->
????????????<LookFor>/(d{4})?/?(d{1,2})?/?(d{1,2})?/?([a-zA-Z]+).html</LookFor>
????????????<SendTo>/$4.aspx</SendTo>
????????</RewriterRule>????????????
????????<RewriterRule><!--單個(gè)日志編輯-->
????????????<LookFor>/(d{4})?/?(d{1,2})?/?(d{1,2})?/?edit(d+).html</LookFor>
????????????<SendTo>/blogedit.aspx?logID=$4</SendTo>
????????</RewriterRule>????????????????????????
????</Rules>
</RewriterConfig>
要真正的學(xué)好正則、應(yīng)用正則的確是很不容易,所以在平時(shí)的學(xué)習(xí)中還是要經(jīng)過大量的實(shí)踐與思考,我也會(huì)積極的向各位同仁請(qǐng)教、學(xué)習(xí),希望大家不吝賜教!
附件web.config及所使用的urlrewritting的dll
?/Files/showker/WebConfig.rar
轉(zhuǎn)載于:https://www.cnblogs.com/freeliver54/archive/2013/03/01/2938116.html
總結(jié)
以上是生活随笔為你收集整理的[转]URLRewrite隐藏.aspx后缀名的应用(转载+延伸)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: error C2664: “wcscpy
- 下一篇: TCP拥塞控制算法 — CUBIC的补丁