URL重寫可刪節日期模式---Regex之強力應用

來源:互聯網
上載者:User
日期|正則

最近忙著自己的部落格程式,自然而然就轉到了部落格中老生長談的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

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

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

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

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


基礎: UrlRewriter.net組件(當然也可以自已寫), 瞭解Regex

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

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

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

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

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

主角又要出場了:Regex。

在這裡用Regex真的是太帥了~ 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&year=$2&month=$3&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&year=$2&month=$3&day=$4&time=$5</SendTo>
</RewriterRule>
 

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

其實一說可能有很多人都能想到用檔案名稱來代替目錄結構。想想看,是不是這樣。當然這還得對Regex有一定的瞭解。

好,來看看實現吧。

<RewriterRule>
    <LookFor>~/(w{5,16})/Articles/(d{4})\/(d{2})\/(d{2})\/(d{6}).aspx</LookFor>
    <SendTo>~/Default.aspx?ArticleID=$2$3$4$5&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&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  (joshuasco@126.com )  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&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&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&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&Bloger=$2</SendTo>
            </RewriterRule>
            <RewriterRule>
                <LookFor>~/Articles/(d{4})((\/)?).aspx</LookFor>
                <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重寫過程後像實際存在此目錄一樣會具有嚴密的格式但顯得架構結構更方便更靈活,從而得到功能和使用者體驗上的重點提升
暫時到這裡吧。有什麼疑問歡迎回複加入討論。如果有更好的重寫方法很高興能通知下本人哦。



相關文章

Beyond APAC's No.1 Cloud

19.6% IaaS Market Share in Asia Pacific - Gartner IT Service report, 2018

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。