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