C# UrlRewrite
發(fā)布日期:2022/8/31 作者:
瀏覽:716
using System; using System.Web; using System.Text.RegularExpressions; using System.Xml; /// <summary> ///UrlRewrit /// </summary> namespace qhwins.SEO { //繼承自IHttpModule接口 public class HttpModule : System.Web.IHttpModule { /**//// <summary> /// 實(shí)現(xiàn)接口的Init方法 /// </summary> /// <param name="context"></param> public void Init(HttpApplication context) { //建立個委托讓他執(zhí)行下面的ReUrl_BeginRequest事件 context.BeginRequest += new EventHandler(ReUrl_BeginRequest); } /**//// <summary> /// 實(shí)現(xiàn)接口的Dispose方法 /// </summary> public void Dispose() { } private void ReUrl_BeginRequest(object sender, EventArgs e) { HttpContext context = ((HttpApplication)sender).Context; string requestPath = context.Request.Path.ToLower(); //SiteUrls是下面的一個類,這里大家可以重構(gòu)下 foreach (SiteUrls.URLRewrite url in SiteUrls.GetSiteUrls().Urls) { //是否找到了匹配選項(xiàng) if (Regex.IsMatch(requestPath, url.Pattern, RegexOptions.None | RegexOptions.IgnoreCase)) { //開始替換成我們程序能讀懂的url //string newUrl = Regex.Replace(requestPath.Substring(context.Request.Path.LastIndexOf("/")), url.Pattern, url.QueryString, RegexOptions.None | RegexOptions.IgnoreCase); //context.Response.Write("input=" + requestPath.Substring(context.Request.Path.IndexOf("/")) + "<br/>Pattern=" + url.Pattern + "<br/>" + "url.QueryString=" + url.QueryString + "<br/>"); string newUrl = Regex.Replace(requestPath.Substring(context.Request.Path.IndexOf("/")), url.Pattern, url.QueryString, RegexOptions.None | RegexOptions.IgnoreCase); //這里你可以輸出一下看看 //context.Response.Write("<br/>url.Page=" + url.Page + "<br>newUrl=" + newUrl + "<br>"); //context.Response.End(); //開始把用戶便于記憶的URL替換成程序能讀懂的url //context.Response.Write("url.Page=" + url.Page + "<br/>newUrl=" + newUrl); context.RewritePath(url.Page, string.Empty, newUrl); //參數(shù)說明:虛擬路徑、路徑信息、查詢字符串信息 } } } } public class SiteUrls { //定義成volatitle類型主要是為了多線程訪問方便,在這個示例程序中沒什么實(shí)際意義,項(xiàng)目大了就有用了 private static volatile SiteUrls instance = null; string UrlsFile = HttpContext.Current.Server.MapPath("~/config/urls.config"); //定義兩個屬性 private System.Collections.ArrayList _Urls; public System.Collections.ArrayList Urls { get { return _Urls; } set { _Urls = value; } } //這個就是個鍵植對 表害怕一點(diǎn)也不高深 private System.Collections.Specialized.NameValueCollection _Paths; public System.Collections.Specialized.NameValueCollection Paths { get { return _Paths; } set { _Paths = value; } } //構(gòu)造函數(shù) private SiteUrls() { Urls = new System.Collections.ArrayList(); Paths = new System.Collections.Specialized.NameValueCollection(); //以XML個數(shù)讀取那CONFIG文件 XmlDocument urlconfig = new XmlDocument(); urlconfig.Load(UrlsFile); XmlNode root = urlconfig.SelectSingleNode("urls"); foreach (XmlNode n in root.ChildNodes) { //XmlNodeType.Comment如果不是注釋 if (n.NodeType != XmlNodeType.Comment && n.Name.ToLower() == "rewrite") { XmlAttribute name = n.Attributes["name"]; XmlAttribute path = n.Attributes["path"]; XmlAttribute page = n.Attributes["page"]; XmlAttribute querystring = n.Attributes["querystring"]; XmlAttribute pattern = n.Attributes["pattern"]; if (name != null && path != null && page != null && querystring != null && pattern != null) { Paths.Add(name.Value, path.Value); //壓進(jìn)去的都是url實(shí)體類 Urls.Add(new URLRewrite(name.Value, pattern.Value, page.Value.Replace("^", "&"), querystring.Value.Replace("^", "&"))); } } } } //用方法實(shí)例化 public static SiteUrls GetSiteUrls() { if (instance == null) { instance = new SiteUrls(); } return instance; } // url實(shí)體類#region url實(shí)體類 public class URLRewrite { // 成員變量#region 成員變量 private string _Name; public string Name { get { return _Name; } set { _Name = value; } } private string _Pattern; public string Pattern { get { return _Pattern; } set { _Pattern = value; } } private string _Page; public string Page { get { return _Page; } set { _Page = value; } } private string _QueryString; public string QueryString { get { return _QueryString; } set { _QueryString = value; } } // 構(gòu)造函數(shù)#region 構(gòu)造函數(shù) public URLRewrite(string name, string pattern, string page, string querystring) { _Name = name; _Pattern = pattern; _Page = page; _QueryString = querystring; } //#endregion } //#endregion }}
定義:
<?xml version="1.0" encoding="utf-8"?> <urls> <!--<rewrite name="default" path="/default-{0}-{1}.aspx" pattern = "/default-(\d+)(-(\d+))?.aspx" page="/default.aspx" querystring="id=$1^page=$3" />--> <!--<rewrite name="Flower" path="/Flower-{0}.aspx" pattern = "^/Flower-(\d{1,4}).aspx$" page="/Flower.aspx" querystring="page=$1" />--> <rewrite name="Default" path="/Default.html" pattern = "^/default.html$" page="/default.aspx" querystring="" /> <!--首頁--> <rewrite name="Job" path="/job.html" pattern = "^/job.html$" page="/job.aspx" querystring="" /> <!--人才--> <rewrite name="News" path="/nl/{0}-{1}.html" pattern = "^/nl/(\d{1,6})(-(\d{1,4}))?.html$" page="/News.aspx" querystring="ClassCode=$1^page=$3" /> </urls>使用,在webconfig中配置
<system.web> ... ... <httpModules> <add type="qhwins.SEO.HttpModule" name="HttpModule"/> </httpModules> <pages validateRequest="false" enableSessionState="true" enableViewStateMac="false"></pages> <globalization fileEncoding="utf-8"/> <machineKey validation="3DES" validationKey="318W9AF6GC2B7A87C996B280450BB36506A8DFEDF9B51211" decryption="3DES" decryptionKey="998950BB36319B474C996B506A95AEDF9B51211B1DA7B287"/> </system.web>
下拉加載更多評論