最近忙著自己的部落格程序,自然而然就轉到了博客中老生長談的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>
這樣寫出的規則在進行刪節時一定會因為造訪的頁面不存在而產生404錯誤。因為它會順著你的目錄標記一直往下找,要是再建目錄工程可就大了,再看看下邊的程式碼:
這下多出了時間部分該沒人會選擇建目錄了。那就充分利用已經存在的文件來完成這個任務吧。
其實一說可能有很多人都能想到用檔案名稱來取代目錄結構。想想看,是不是這樣。當然這還得對正規表示式有一定的了解。
好,來看看實現吧。
大家很容易看出我這裡用到了「」對「/」進行了轉義,而且用在了文件名裡邊現在的結構就是
http://blog.tyoo.net/joshualang/2007/01/18. aspx
很顯然我的ArticleID就是一個以年月日時分秒為基礎的字串,因為這樣插入資料不用考慮重複還有意義,而在這裡用時間也為查詢時方便。 $2$3$4$5得到的14位元組合就是我的ArticleID.透過發表日期,文章編號都可以很容易查出記錄。而最後一點好處就在進行刪節時表現的特為明顯。
現在來讓我們刪節時間部分:
依序我們可以將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也是不行的。還需要定義其它應對規則來實現恰如其份的重寫效果。
好了,大致上效果已經出來了;這裡有完整的規則碼:
說明:在這裡為了訪問使用者誤刪節掉重要的.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