1. 程式人生 > >利用RewritePath和pathInfo實現URL重寫及其優點

利用RewritePath和pathInfo實現URL重寫及其優點

我們經常使用:RewritePath(string path);來實現URL重寫 ,它還具有3個引數的過載形式RewritePath(string filePath, string pathInfo, string queryString);其中filePath是重寫路徑 , queryString是查詢字串, pathInfo這個引數比較有意思,是指附加到filePath的資訊. 可以在請求頁面使用Request.PathInfo獲取該引數的值. 看以下的URL重寫片段程式碼: (來自Cuyahoga) 原URL:        /14/section.aspx/ForumView/2 重寫規則:     <add match="(/d+)//section.aspx([/w|/]*)/??(.*)" replace="Default.aspx$2?SectionId=$1&amp;$3" /> 重寫後的URL:  /Default.aspx/ForumView/2?SectionId=14& string rewritePath = Regex.Replace(urlToRewrite, matchExpression, UrlHelper.GetApplicationPath() + mappings[i], RegexOptions.IgnoreCase | RegexOptions.Singleline); //rewritePath的值為:/Default.aspx/ForumView/2?SectionId=14& // MONO_WORKAROUND: split the rewritten path in path, pathinfo and querystring // because MONO doesn't handle the pathinfo directly
//context.RewritePath(rewritePath);string querystring = String.Empty; string pathInfo = String.Empty; string path = String.Empty; // 1. extract querystringint qmark = rewritePath.IndexOf("?"); if (qmark !=-1|| qmark +1< rewritePath.Length) {     querystring = rewritePath.Substring (qmark +1);//擷取?號後面的查詢字串 SectionId=14&
    rewritePath = rewritePath.Substring (0, qmark);//  /Default.aspx/ForumView/2} // 2. extract pathinfoint pathInfoSlashPos = rewritePath.IndexOf("aspx/"+4;//獲取pathInfo的位置:"aspx/"後出現的字串if (pathInfoSlashPos >3)//若存在"aspx/"{     pathInfo = rewritePath.Substring(pathInfoSlashPos);// pathInfo:"/ForumView/2"    rewritePath 
= rewritePath.Substring(0, pathInfoSlashPos);// rewritePath:"/Default.aspx"} // 3. pathpath = rewritePath; //path : "/Default.aspx" //pathInfo : "/ForumView/2" //querystring : "SectionId=14&" //執行重寫this._currentContext.RewritePath(path, pathInfo, querystring); rewrittenUrl = path + pathInfo; if (querystring.Length >0) {     rewrittenUrl +="?"+ querystring; }     為什麼不用RewritePath(rewritePath)直接進行重寫呢? 通過pathInfo可以將URL的引數分為兩個部分, 一部分是path+querystring , 一部分是pathInfo .     這種方式對於基於模組構建的系統就非常有用. 系統的主幹部分用path+querystring引數  , 子模組用pathInfo引數 . 這樣可以在子模組中處理關於自己的URL引數,新增子模組時不需要在系統的web.config 中新增子模組的URL重寫規則.     還有一點 這樣可以支援Mono