url重寫,一般都是先配置重寫規則如:virtualUrl="^~/(\d+).html"toUrl = "~/Default.aspx?ID=$1"? 這樣就能通過訪問/100.html重寫到實際的default.aspx?id=100的地址。然后在頁面中這樣寫: <a href="/100.html"> 而不是原先的<a href="default.aspx?id=100">假如要修改重寫的地址,責要修改所有頁面的重寫鏈接,以及重寫規則。很是麻煩!--------------問題來了:上面輸出url的兩個a瞄,一個是重寫的,一個是未重寫的實際地址。 如何自動切換,最笨的方法可能用if(重寫==true)就輸出/100.html,否則是默認的,在每一個a超連接上進行判斷輸出,這樣很累。?? 能否通過一個方法自動反射出想要的鏈接呢, 如<a href="<%=getUrl("default.aspx?id=100") %>"> ,這個getUrl(string)的方法去讀取規則,反射出virtualUrl地址,這樣以后只需要修改重寫規則,頁面就會自動輸出新的規則地址,無需再修改每個頁面的超鏈接。還可以通過判斷切換輸出,如沒開啟重寫,直接原樣返回輸出。想要這個getUrl(string)的方法代碼,不要非常詳細,大致能實現即可。謝謝因為getUrl傳入的是實際url地址,而在規則里面toUrl的數據不是正則格式,只是匹配格式。這個可能有點難度,還得有點性能。 再謝!
// 我大概的寫寫,里面關鍵的集合匹配以及構造虛擬url的代碼不知道怎樣寫了// 希望高手幫忙. 或提供下其他的思路public static getUrl(string originalUrl){if(systemIsUrlRewrite){ foreach(reurl in reurls)//遍歷重寫的正則集合 { if(originalUrl 匹配 reurl.toUrl) { return build_virtualUrl(reurl,originalUrl); //如果集合中有此url的重寫規則,就輸出此源url的虛擬url,也得用正則吧? } }}else{ return originalUrl;//系統沒開啟url重寫,直接返回原始url}}
?
明天.NET 老大, 謝謝你的代碼思路,我改寫了下, 腦子還有點亂, 現在是完全可以反置那些"正規"的規則了,也就是虛擬url和實際url匹配組要相等. 遇到不相等的恐怕還得加一個循環去折騰. 我覺得在反轉替換的時候可以直接在正則遍歷時進行,正好減少一個循環. 我再清理下頭緒,添加個循環處理"不規則"的規則,應該還是3個循環.
這是我改后的:? 懇請斧正
再次修改====改為3個循環,?簡單測試支持復雜的規則匹配,不限定規則組次序.?? 想了想或許只有2個循環也能解決? 用到使用只需要解決字符轉義了.
?
protected void Page_Load(object sender, EventArgs e) { UrlRewriteRoute test = new UrlRewriteRoute(); //test.VirtualPath = @"~/ 數字(\d+) / 字符(\w+) / 字母([a-zA-Z]*) - 無厘頭(.*) \.html"; //test.ToUrl = @"~/1.aspx? 字母=$3 字符=$2 無厘頭=$4 數字=$1"; test.VirtualPath = @"~/([a-zA-Z]*)\/(.[0-9]*[a-zA-Z]*)/([0-9]*)/(\w+)/([a-zA-Z]*)\.aspx"; test.ToUrl = @"~/WebPage/$1/$2.aspx?classid=$2;page=$3;keys=$4"; var result = ReverseRoute(test); Response.Write(test.VirtualPath + "<br/>" + test.ToUrl + "<br/><br/>"); Response.Write(result.VirtualPath + "<br/>" + result.ToUrl + "<br/>"); } public static UrlRewriteRoute ReverseRoute(UrlRewriteRoute route) { UrlRewriteRoute result = new UrlRewriteRoute(); string New_toUrl = route.VirtualPath; //反轉定義 string New_virtualUrl = route.ToUrl; List<string> virtualList = new List<string>(); MatchCollection virtualMatch = Regex.Matches(route.VirtualPath, @"(\(.+?\))"); //先遍歷出來轉存到List ,List輸出內容后倒置成位置索引 foreach (Match m in virtualMatch) { virtualList.Add(m.Groups[1].Value); } Regex tourlReg = new Regex(@"\$(\d+)"); int i = 1; foreach (Match m in tourlReg.Matches(route.ToUrl)) { int GroupNum = Convert.ToInt32(m.Groups[1].Value); if (virtualList.Count >= GroupNum) { New_virtualUrl = New_virtualUrl.Replace(m.Value, string.Format("{0}", virtualList[GroupNum - 1])); virtualList[GroupNum - 1] = "$"+i.ToString(); //將虛擬Url的索引位置倒置進去 也就是當前索引 i++; } } int k = 0; foreach (Match matGroup in virtualMatch) { //這里的遍歷和預存virtualList是一樣的,為了能夠對應索引位置 //替換相同索引位置的規則匹配組為新的虛擬匹配組位置索引,已經基本支持更復雜的規則匹配 New_toUrl = New_toUrl.Replace(matGroup.Value, virtualList[k]); k++; } result.ToUrl = New_toUrl; result.VirtualPath = New_virtualUrl; //這里還要解決字符轉義問題 return result; } public class UrlRewriteRoute { public string VirtualPath { get; set; } public string ToUrl { get; set; } }
?
?
?
- 1 回答
- 0 關注
- 408 瀏覽
添加回答
舉報
0/150
提交
取消