程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> .NET實例教程 >> URL重寫可刪節日期模式---正則表達式之強力應用

URL重寫可刪節日期模式---正則表達式之強力應用

編輯:.NET實例教程


最近忙著自己的博客程序,自然而然就轉到了博客中老生長談的URL重寫問題。一個原因是在多用戶博客系統中的一個面子問題,本來想拿我的CSDN博客http://blog.csdn.net/joshualang來說事,想想還是用我的空間(http://www.tyoo.Net)吧,因為這是我的博客完功之後的去所了。

像http://www.tyoo.net/blog/joshualang 如若不進行必要的URL重寫,就會出http://www.tyoo.net/blog/default.aspx?Bloger=joshualang樣子的博客地址;大家要知道BLOG可謂是大部分網民視為築在網絡上的另一個家,現實生活中會考慮家的地址遠近,交通好壞,同樣網絡中的家也要有個好記的門牌號的。這個門牌號還不算太長(還不是很體面哦),後邊在加上一堆的參數只怕讓人慢慢見而生畏,要看文章就要面對這麼一大堆http://blog.tyoo.net/Articles/Default.ASPx?Bloger=joshualang&ArticleID=20070118234530是不是有什麼感覺了?再看看現在好多博客程序都要得到的一種效果吧http://blog.tyoo.Net/joshua/Articles/2007/01/18/大家一看就知道這種效果的好處了,這也就引到了本文的重點所在了!

是的,要通過這樣一個很規整的字符串來達到我們的一個目標。

一個可行的URL應該遵循以下標准來選擇 :

• 簡短。 
 
• 易於鍵入。 
 
• 可以看出站點的結構。 
 
• “可刪節”,允許用戶通過刪除 URL 的組成部分來浏覽站點。 
 

致於這點就不用我來多說了,其實都是要突出簡單,實用。

注意:說到這裡就有必要看看MSDN網站上Scott Mitchell的一遍文檔http://www.microsoft.com/china/msdn/library/webservices/ASP.Net/URLRewriting.mspx?pf=true#top

已經有專家在這裡將URL重寫的原理講得足夠明確了,不懂還可以下載上邊文檔的源代碼 來研究一下。

為了圖效率(人的時間是寶貴的,程序員的時間更是),就直接采用URLRewriter.Net的組件,實際上以前沒接觸過URL重寫經歷,大致得源程序看了幾遍就開始上路了。開始當然不求什麼技術含量了,只要能重寫成功就已經感覺很OK了,然後才是在不斷的重寫過程中找出其中問題還有新思路,新發現。。。所以就有了這遍文章。

現在開始吧。這次針對的其實主要就是剛提到的日期模式的URL重寫.

http://blog.tyoo.Net/Articles/2007/01/18/233030/joshualang.ASPx 這就是要在這裡實現的最終效果。


基礎: UrlRewriter.Net組件(當然也可以自已寫), 了解正則表達式

參數:ArticleID  //文章編號 [ 類型:string    長度:14(like:yyyymmddhhmmss)//有意義且不會重復  ]

            Bloger   //博主用戶名[ 類型:string   字母開頭 ]

在URL重寫過程中遇到的一個問題就是在訪問不存在的目錄或文件時出現404錯誤。在MSDN上的這遍文檔提供的建議就是在程序目錄下建立必要的文件夾目錄及空的頁面,說麻煩的確是麻煩,數千的目錄需要建立。

既然不能隨便就訪問不存在的目錄文件,那我們不訪問這樣的目錄不就行了。就要訪問我們已經存在的文件(我的全部URL指向都是根目錄Blog下的一個Default.aspx頁面然後動態加載控件組生成不同的視圖功能頁面)當然這次要指向的還是這個頁面~/Default.ASPx;

下面的任務就是傳遞參數,當然是URL傳值了。這就是重寫它的原因了。

主角又要出場了:正則表達式。

在這裡用正則表達式真的是太帥了~ http://blog.tyoo.Net/joshualang/Articles/2007/01/18/Default.ASPx目錄你可能會生成如下這樣的URL重寫規則:

<RewriterRule>
           <LookFor>~/(w{6,16})/Articles/(d{4})/(d{2})/(d{2})/Default.ASPx</LookFor>
           <SendTo>~/Default.ASPx?Bloger=$1&amp;year=$2&amp;month=$3&amp;day=$4</SendTo>
</RewriterRule>
 

這樣寫出的規則在進行刪節時肯定是會因為訪問的頁面不存在而產生404錯誤。因為它會順著你的目錄標記一直往下找,要是再建目錄工程可就大了,再看看下邊的代碼:

<RewriterRule>
           <LookFor>~/(w{6,16})/Articles/(d{4})/(d{2})/(d{2})/(d{6})/Default.ASPx</LookFor>
           <SendTo>~/Default.ASPx?Bloger=$1&amp;year=$2&amp;month=$3&amp;day=$4&amp;time=$5</SendTo>
</RewriterRule>
 

這下多出了時間部分該沒人會選擇建目錄了。那就充分利用已經存在的文件來完成這個任務吧。

其實一說可能有很多人都能想到用文件名來代替目錄結構。想想看,是不是這樣。當然這還得對正則表達式有一定的了解。

好,來看看實現吧。

<RewriterRule>
    <LookFor>~/(w{5,16})/Articles/(d{4})\/(d{2})\/(d{2})\/(d{6}).ASPx</LookFor>
    <SendTo>~/Default.ASPx?ArticleID=$2$3$4$5&amp;Bloger=$1</SendTo>
</RewriterRule>
 

大家很容易看出我這裡用到了“\”對“/”進行了轉義,而且用在了文件名裡邊現在的結構就是

http://blog.tyoo.Net/joshualang/2007/01/18.ASPx

很顯然我的ArticleID就是一個以年月日時分秒為基礎的字符串,因為這樣插入數據不用考慮重復還有意義,而在這裡用時間也為查詢時方便。$2$3$4$5得到的14位組合就是我的ArticleID.通過發表日期,文章編號都可以很容易查出記錄。而最後一點好處就在進行刪節時表現的特為明顯。

現在來讓我們刪節時間部分:

<RewriterRule>
    <LookFor>~/(w{5,16})/Articles/(d{4})\/(d{2})\/(d{2}).ASPx</LookFor>
    <SendTo>~/Default.ASPx?ArticleID=$2$3$4&amp;Bloger=$1</SendTo>
</RewriterRule>
 

依次我們可以將URL刪節為這樣的模式:http://blog.tyoo.net/joshualang/Articles/2007.ASPx甚至http://blog.tyoo.Net/joshualang/Articles/Default.ASPx

是不是很簡單。但你要注意一個問題了:什麼事不是能夠就會實現的了,須要考慮的還有很多比如:

http://blog.tyoo.net/joshualang/Articles/2007.ASPx和http://blog.tyoo.Net/joshualang/Articles/2007/.ASPx有什麼區別,做到上邊的規則後後者能否正常運行?不能

同樣:http://blog.tyoo.Net/joshualang/Articles/2007/01/08/.ASPx也是不行的。還需要定義其它應對規則來實現恰如其份的重寫效果。

好了,大致上效果已經出來了;這裡是完整的規則代碼:

 

<!--author: Joshua Li  ([email protected] )  QQ:245965348-->
<!-- Rules for Blog Content Displayer -->
            <RewriterRule>
                <LookFor>~/([A-Za-z]w{5,16})/Default.ASPx</LookFor>
                <SendTo>~/Default.ASPx?Bloger=$1</SendTo>
            </RewriterRule>
            <!-- Rules for Article Lister -->
            <RewriterRule>
                <LookFor>~/Articles/(d{4})\/(d{2})\/(d{2})\/(d{1,6})\/([A-Za-z]w{5,16}).ASPx</LookFor>
                <SendTo>~/Default.ASPx?ArticleID=$1$2$3$4&amp;Bloger=$5</SendTo>
            </RewriterRule>
            <RewriterRule>
                <LookFor>~/Articles/(d{4})\/(d{2})\/(d{2})\/(d{1,6})((\/)?).ASPx</LookFor>
             
   <SendTo>~/Default.ASPx?ArticleID=$1$2$3$4</SendTo>
            </RewriterRule>
            <RewriterRule>
                <LookFor>~/Articles/(d{4})\/(d{2})\/(d{2})\/([A-Za-z]w{5,16}).ASPx</LookFor>
                <SendTo>~/Default.ASPx?ArticleID=$1$2$3&amp;Bloger=$4</SendTo>
            </RewriterRule>
            <RewriterRule>
                <LookFor>~/Articles/(d{4})\/(d{2})\/(d{2})((\/)?).ASPx</LookFor>
                <SendTo>~/Default.ASPx?ArticleID=$1$2$3</SendTo>
            </RewriterRule>
            <RewriterRule>
                <LookFor>~/Articles/(d{4})\/(d{2})\/([A-Za-z]w{5,16}).ASPx</LookFor>
                <SendTo>~/Default.ASPx?ArticleID=$1$2&amp;Bloger=$3</SendTo>
            </RewriterRule>
            <RewriterRule>
                <LookFor>~/Articles/(d{4})\/(d{2})((\/)?).ASPx</LookFor>
                <SendTo>~/Default.ASPx?ArticleID=$1$2</SendTo>
            </RewriterRule>
            <RewriterRule>
                <LookFor>~/Articles/(d{4})\/([A-Za-z]w{5,16}).ASPx</LookFor>
                <SendTo>~/Default.ASPx?ArticleID=$1&amp;Bloger=$2</SendTo>
            </RewriterRule>
            <RewriterRule>
                <LookFor>~/Articles/(d{4})((\/)?).ASPx</Loo
kFor>
                <SendTo>~/Default.ASPx?ArticleID=$1</SendTo>
            </RewriterRule>
            <RewriterRule>
                <LookFor>~/Articles/([A-Za-z]w{5,16}).ASPx</LookFor>
                <SendTo>~/Default.ASPx?Bloger=$1</SendTo>
            </RewriterRule>
            <RewriterRule>
                <LookFor>~/Articles/Default.ASPx</LookFor>
                <SendTo>~/Default.ASPx?ArticleID=-1</SendTo>
            </RewriterRule>
說明:在這裡為了訪止用戶誤刪節掉重要的.ASPx擴展名,我將用戶名作為了文件的虛擬標識名稱。

最後得到的URL:  http://blog.tyoo.Net/Articles/2007/01/18/015000/joshualang.ASPx

同時將放在最後的最長為6位的時間設置為可刪節變長,就算丟了某些數字也能最方便的找到與該發表時間最接近的列表。

在去除用戶名後也不會影響到使用,還是通過前邊詳細的時間格式很快會得到與您需要的文章最批配的列表。如果用戶名完好則能通過刪節找到特定時間段對應作者的文章列表。

還要注意的是:用戶名的格式([A-Za-z]{6-16})和規則驗證的順序。

總結:
    通過規則的URL重寫過程後像實際存在此目錄一樣會具有嚴密的格式但顯得框架結構更方便更靈活,從而得到功能和用戶體驗上的重點提升
暫時到這裡吧。有什麼疑問歡迎回復加入討論。如果有更好的重寫方法很高興能通知下本人哦。
http://www.cnblogs.com/Joshualang/archive/2007/01/19/624302.Html

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved