Asp.Net 2.0 中的一個新功能是它內建的 url 重寫支援。當我研究這個新功能時,我發現它缺乏正規表示式支持,這確實是 Url Mapper 的重點。 ScottGlu 在他的部落格中解釋了 Asp.Net 團隊沒有實現此功能的原因。基本上,他們意識到全功能版本需要利用下一個 IIS 7.0 新功能,特別是對所有內容類型(圖像和目錄)的支援。
無論如何,在 Asp.Net 中實作具有正規表示式支援的 URL 重寫模組非常簡單。我為此寫了一個快速而簡單的 HttpModule。整個魔法是在 HttpModule 中的幾行內完成的:
1 public void Rewrite_BeginRequest(object sender, System.EventArgs args) {
2 字串strPath = HttpContext.Current.Request.Url.AbsolutePath;
3 UrlRedirection oPR = new UrlRedirection();
4 字串 strURL = strPath;
5 字串 strRewrite = oPR.GetMatchingRewrite(strPath);
6 if (!String.IsNullOrEmpty(strRewrite)) {
7 strURL = strRewrite;
8 } 其他 {
9 字串URL=字串路徑;
10}
11 HttpContext.Current.RewritePath("~" + strURL);
12}
該程式碼是不言自明的。當 Asp.Net 引擎處理請求時,模組會檢查 xml 中是否存在正規表示式匹配。我見過許多使用 Web.config 來儲存匹配規則的 URL 重寫引擎,但我更喜歡使用附加的 xml 檔案。重寫規則檔案如下:
1 <?xml version="1.0"encoding="utf-8"standalone="yes"?>
2 <url重寫>
3 <規則名稱=“類別頁面”>
4 <url>/([a-zA-Z][w-]{1,149}).aspx</url>
5 <rewrite>/Default.aspx?Category=$1</rewrite>
6 </規則>
7 <規則名稱=“項目頁面”>
8 <url>/([a-zA-Z][w-]{1,149})/([a-zA-Z][w-]{1,149}).aspx</url>
9 <rewrite>/Default.aspx?Category=$1&Item=$2</rewrite>
10 </規則>
11 </url重寫>
在 GetMatchingRewrite() 方法中實作的規則比對程式非常簡單且輕量:
1 public string GetMatchingRewrite(string URL) {
2 字串 strRtrn = "";
3
4 System.Text.RegularExpressions.Regex oReg;
5
6 foreach (規則中的RedirectRule oRule) {
7
8 Reg = new Regex(oRule.URL);
9 符合 oMatch = oReg.Match(URL);
10
11 if (oMatch.Success) {
12 strRtrn = oReg.Replace(URL, oRule.Rewrite);
13}
14
15}
16返回strRtrn;
17}
我上傳了一個使用此重寫引擎的範例專案。 HttpModule 及其輔助類別位於 App_Code 資料夾內。我希望您發現此程式碼有用,如果您有任何疑問,請在此條目中發表評論。快樂編碼!
-------------------------------------------------- ------------------------------------------
來自DEVEL.oping.net
發表於 2006-04-26 14:17 徐燦鑷Asp.net專欄閱讀(48) 評論(1) 編輯收藏 收藏至365Key類別分類: .net2.0
評論:
# re: Url Rewriting with Regex for ASP.NET 2.0(在asp.net2.0中使用正規表達式建立URL重寫) 2006-04-26 20:22 | AXii
哈,測試後1 public void Rewrite_BeginRequest(object sender, System.EventArgs args)
2 {
3 字串appPath = HttpContext.Current.Request.ApplicationPath;
4 HttpContext.Current.Response.Write(appPath + "<br />");
5
6 字串 strPath = HttpContext.Current.Request.Url.AbsolutePath;
7 HttpContext.Current.Response.Write(strPath + "<br />");
8
9 strPath = strPath.Substring(appPath.Length);
10
11 HttpContext.Current.Response.Write(strPath + "<br />");
12
13 UrlRedirection oPR = new UrlRedirection();
14
15 字串 strURL = strPath;
16
17 字串 strRewrite = oPR.GetMatchingRewrite(strPath);
18
19 if (!String.IsNullOrEmpty(strRewrite))
20 {
21 strURL = strRewrite;
22}
23 其他
24{
25 字串URL = 字串路徑;
26}
27
28 HttpContext.Current.RewritePath("~" + strURL);
29 } 找到這個針對虛擬路徑會出現轉送錯誤的處理方法,注意第2、3、9行,是我增加的,可以有效的解決虛擬路徑問題。
2、無法滿足頁面回發的問題!