最近忙著自己的博客程序,自然而然就轉(zhuǎn)到了博客中老生長談的url重寫問題。一個原因是在多用戶博客系統(tǒng)中的一個面子問題,本來想拿我的csdn博客http://blog.csdn.net/joshualang來說事,想想還是用我的空間(http://www.tyoo.net)吧,因?yàn)檫@是我的博客完功之后的去所了。
像http://www.tyoo.net/blog/joshualang 如若不進(jìn)行必要的url重寫,就會出http://www.tyoo.net/blog/default.aspx?bloger=joshualang樣子的博客地址;大家要知道blog可謂是大部分網(wǎng)民視為筑在網(wǎng)絡(luò)上的另一個家,現(xiàn)實(shí)生活中會考慮家的地址遠(yuǎn)近,交通好壞,同樣網(wǎng)絡(luò)中的家也要有個好記的門牌號的。這個門牌號還不算太長(還不是很體面哦),后邊在加上一堆的參數(shù)只怕讓人慢慢見而生畏,要看文章就要面對這么一大堆http://blog.tyoo.net/articles/default.aspx?bloger=joshualang&articleid=20070118234530是不是有什么感覺了?再看看現(xiàn)在好多博客程序都要得到的一種效果吧http://blog.tyoo.net/joshua/articles/2007/01/18/大家一看就知道這種效果的好處了,這也就引到了本文的重點(diǎn)所在了!
是的,要通過這樣一個很規(guī)整的字符串來達(dá)到我們的一個目標(biāo)。
一個可行的url應(yīng)該遵循以下標(biāo)準(zhǔn)來選擇 :
• 簡短。
• 易于鍵入。
• 可以看出站點(diǎn)的結(jié)構(gòu)。
• “可刪節(jié)”,允許用戶通過刪除 url 的組成部分來瀏覽站點(diǎn)。
致于這點(diǎn)就不用我來多說了,其實(shí)都是要突出簡單,實(shí)用。
注意:說到這里就有必要看看msdn網(wǎng)站上scott mitchell的一遍文檔http://www.microsoft.com/china/msdn/library/webservices/asp.net/urlrewriting.mspx?pf=true#top
已經(jīng)有專家在這里將url重寫的原理講得足夠明確了,不懂還可以下載上邊文檔的源代碼 來研究一下。
為了圖效率(人的時間是寶貴的,程序員的時間更是),就直接采用urlrewriter.net的組件,實(shí)際上以前沒接觸過url重寫經(jīng)歷,大致得源程序看了幾遍就開始上路了。開始當(dāng)然不求什么技術(shù)含量了,只要能重寫成功就已經(jīng)感覺很ok了,然后才是在不斷的重寫過程中找出其中問題還有新思路,新發(fā)現(xiàn)。。。所以就有了這遍文章。
現(xiàn)在開始吧。這次針對的其實(shí)主要就是剛提到的日期模式的url重寫.
http://blog.tyoo.net/articles/2007/01/18/233030/joshualang.aspx 這就是要在這里實(shí)現(xiàn)的最終效果。
基礎(chǔ): urlrewriter.net組件(當(dāng)然也可以自已寫), 了解正則表達(dá)式
參數(shù):articleid //文章編號 [ 類型:string 長度:14(like:yyyymmddhhmmss)//有意義且不會重復(fù) ]
bloger //博主用戶名[ 類型:string 字母開頭 ]
在url重寫過程中遇到的一個問題就是在訪問不存在的目錄或文件時出現(xiàn)404錯誤。在msdn上的這遍文檔提供的建議就是在程序目錄下建立必要的文件夾目錄及空的頁面,說麻煩的確是麻煩,數(shù)千的目錄需要建立。
既然不能隨便就訪問不存在的目錄文件,那我們不訪問這樣的目錄不就行了。就要訪問我們已經(jīng)存在的文件(我的全部url指向都是根目錄blog下的一個default.aspx頁面然后動態(tài)加載控件組生成不同的視圖功能頁面)當(dāng)然這次要指向的還是這個頁面~/default.aspx;
下面的任務(wù)就是傳遞參數(shù),當(dāng)然是url傳值了。這就是重寫它的原因了。
主角又要出場了:正則表達(dá)式。
在這里用正則表達(dá)式真的是太帥了~ http://blog.tyoo.net/joshualang/articles/2007/01/18/default.aspx目錄你可能會生成如下這樣的url重寫規(guī)則:
<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>
這樣寫出的規(guī)則在進(jìn)行刪節(jié)時肯定是會因?yàn)樵L問的頁面不存在而產(chǎn)生404錯誤。因?yàn)樗鼤樦愕哪夸洏?biāo)記一直往下找,要是再建目錄工程可就大了,再看看下邊的代碼:
<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>
這下多出了時間部分該沒人會選擇建目錄了。那就充分利用已經(jīng)存在的文件來完成這個任務(wù)吧。
其實(shí)一說可能有很多人都能想到用文件名來代替目錄結(jié)構(gòu)。想想看,是不是這樣。當(dāng)然這還得對正則表達(dá)式有一定的了解。
好,來看看實(shí)現(xiàn)吧。
<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>
大家很容易看出我這里用到了“/”對“/”進(jìn)行了轉(zhuǎn)義,而且用在了文件名里邊現(xiàn)在的結(jié)構(gòu)就是
http://blog.tyoo.net/joshualang/2007/01/18.aspx
很顯然我的articleid就是一個以年月日時分秒為基礎(chǔ)的字符串,因?yàn)檫@樣插入數(shù)據(jù)不用考慮重復(fù)還有意義,而在這里用時間也為查詢時方便。$2$3$4$5得到的14位組合就是我的articleid.通過發(fā)表日期,文章編號都可以很容易查出記錄。而最后一點(diǎn)好處就在進(jìn)行刪節(jié)時表現(xiàn)的特為明顯。
現(xiàn)在來讓我們刪節(jié)時間部分:
<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刪節(jié)為這樣的模式:http://blog.tyoo.net/joshualang/articles/2007.aspx甚至http://blog.tyoo.net/joshualang/articles/default.aspx
是不是很簡單。但你要注意一個問題了:什么事不是能夠就會實(shí)現(xiàn)的了,須要考慮的還有很多比如:
http://blog.tyoo.net/joshualang/articles/2007.aspx和http://blog.tyoo.net/joshualang/articles/2007/.aspx有什么區(qū)別,做到上邊的規(guī)則后后者能否正常運(yùn)行?不能
同樣:http://blog.tyoo.net/joshualang/articles/2007/01/08/.aspx也是不行的。還需要定義其它應(yīng)對規(guī)則來實(shí)現(xiàn)恰如其份的重寫效果。
好了,大致上效果已經(jīng)出來了;這里是完整的規(guī)則代碼:
<!--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&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>
說明:在這里為了訪止用戶誤刪節(jié)掉重要的.aspx擴(kuò)展名,我將用戶名作為了文件的虛擬標(biāo)識名稱。
最后得到的url: http://blog.tyoo.net/articles/2007/01/18/015000/joshualang.aspx
同時將放在最后的最長為6位的時間設(shè)置為可刪節(jié)變長,就算丟了某些數(shù)字也能最方便的找到與該發(fā)表時間最接近的列表。
在去除用戶名后也不會影響到使用,還是通過前邊詳細(xì)的時間格式很快會得到與您需要的文章最批配的列表。如果用戶名完好則能通過刪節(jié)找到特定時間段對應(yīng)作者的文章列表。
還要注意的是:用戶名的格式([a-za-z]{6-16})和規(guī)則驗(yàn)證的順序。
總結(jié):
通過規(guī)則的url重寫過程后像實(shí)際存在此目錄一樣會具有嚴(yán)密的格式但顯得框架結(jié)構(gòu)更方便更靈活,從而得到功能和用戶體驗(yàn)上的重點(diǎn)提升
暫時到這里吧。有什么疑問歡迎回復(fù)加入討論。如果有更好的重寫方法很高興能通知下本人哦。
新聞熱點(diǎn)
疑難解答
圖片精選