C# UrlRewrite
发布日期:2022/8/31 作者:
浏览:720
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> /// 实现接口的Init方法 /// </summary> /// <param name="context"></param> public void Init(HttpApplication context) { //建立个委托让他执行下面的ReUrl_BeginRequest事件 context.BeginRequest += new EventHandler(ReUrl_BeginRequest); } /**//// <summary> /// 实现接口的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是下面的一个类,这里大家可以重构下 foreach (SiteUrls.URLRewrite url in SiteUrls.GetSiteUrls().Urls) { //是否找到了匹配选项 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); //参数说明:虚拟路径、路径信息、查询字符串信息 } } } } public class SiteUrls { //定义成volatitle类型主要是为了多线程访问方便,在这个示例程序中没什么实际意义,项目大了就有用了 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; } } //这个就是个键植对 表害怕一点也不高深 private System.Collections.Specialized.NameValueCollection _Paths; public System.Collections.Specialized.NameValueCollection Paths { get { return _Paths; } set { _Paths = value; } } //构造函数 private SiteUrls() { Urls = new System.Collections.ArrayList(); Paths = new System.Collections.Specialized.NameValueCollection(); //以XML个数读取那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); //压进去的都是url实体类 Urls.Add(new URLRewrite(name.Value, pattern.Value, page.Value.Replace("^", "&"), querystring.Value.Replace("^", "&"))); } } } } //用方法实例化 public static SiteUrls GetSiteUrls() { if (instance == null) { instance = new SiteUrls(); } return instance; } // url实体类#region url实体类 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; } } // 构造函数#region 构造函数 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>
下拉加载更多评论