URL重写
Web.Config文件的设置:
<httpModules>
<add type="myHttpModule.HttpModule" name="HttpModule" />
</httpModules>
主要代码:
using
System;
using System.Diagnostics;
using System.Threading;
using System.Web;
using System.Xml;
using System.Text.RegularExpressions;
namespace myHttpModule
... {
/**//// <summary>
/// HttpModule类(URL重写)
/// </summary>
public class HttpModule : System.Web.IHttpModule
...{
//public readonly static Mutex m=new Mutex();
/**//// <summary>
/// 实现接口的Init方法
/// </summary>
/// <param name="context"></param>
public void Init(HttpApplication context)
...{
context.BeginRequest += new EventHandler(ReUrl_BeginRequest);//这里
}
public void Application_OnError(Object sender , EventArgs e)
...{
}
/**//// <summary>
/// 实现接口的Dispose方法
/// </summary>
public void Dispose()
...{
}
/**//// <summary>
/// 重写Url
/// </summary>
/// <param name="sender">事件的源</param>
/// <param name="e">包含事件数据的 EventArgs</param>
private void ReUrl_BeginRequest(object sender, EventArgs e)
...{
HttpContext context = ((HttpApplication)sender).Context;
//string forumPath = "";
string requestPath = context.Request.Path.ToLower();
//遍历每个url重写规则
//string strTemplateid = "";
foreach (SiteUrls.URLRewrite url in SiteUrls.GetSiteUrls().Urls)
...{
if (Regex.IsMatch(requestPath, url.Pattern, RegexOptions.Compiled | RegexOptions.IgnoreCase))
...{
//实际地址
//string newUrl = Regex.Replace(requestPath.Substring(context.Request.Path.LastIndexOf("/")), url.Pattern, url.QueryString, RegexOptions.Compiled | RegexOptions.IgnoreCase);
string newUrl = Regex.Replace(context.Request.Path, url.Pattern, url.QueryString, RegexOptions.Compiled | RegexOptions.IgnoreCase);
//HttpContext.Current.Response.Write(context.Request.Path + "<br/>" + url.Pattern + "<br/>" + url.QueryString + "<br/>");
//HttpContext.Current.Response.Write(url.Page + "<br/>" + newUrl);
//HttpContext.Current.Response.End();
context.RewritePath("/" + url.Page, string.Empty, newUrl);
return;
}
}
context.RewritePath("/" + requestPath);
}
}
/**//// <summary>
/// 站点伪Url信息类
/// </summary>
public class SiteUrls
...{
内部属性和方法#region 内部属性和方法
private static object lockHelper = new object();
private static volatile SiteUrls instance = null;
string SiteUrlsFile = HttpContext.Current.Server.MapPath("~/xml/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();
XmlDocument xml = new XmlDocument();
xml.Load(SiteUrlsFile);
XmlNode root = xml.SelectSingleNode("urls");
foreach(XmlNode n in root.ChildNodes)
...{
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);
Urls.Add(new URLRewrite(name.Value, pattern.Value, page.Value.Replace("^", "&"), querystring.Value.Replace("^", "&")));
}
}
}
}
#endregion
public static SiteUrls GetSiteUrls()
...{
if (instance == null)
...{
lock (lockHelper)
...{
if (instance == null)
...{
instance = new SiteUrls();
}
}
}
return instance;
}
public static void SetInstance(SiteUrls anInstance)
...{
if (anInstance != null)
instance = anInstance;
}
public static void SetInstance()
...{
SetInstance(new SiteUrls());
}
/**//// <summary>
/// 重写伪地址
/// </summary>
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;
}
}
#endregion
构造函数#region 构造函数
public URLRewrite(string name, string pattern, string page, string querystring)
...{
_Name = name;
_Pattern = pattern;
_Page = page;
_QueryString = querystring;
}
#endregion
}
}
}
using System.Diagnostics;
using System.Threading;
using System.Web;
using System.Xml;
using System.Text.RegularExpressions;
namespace myHttpModule
... {
/**//// <summary>
/// HttpModule类(URL重写)
/// </summary>
public class HttpModule : System.Web.IHttpModule
...{
//public readonly static Mutex m=new Mutex();
/**//// <summary>
/// 实现接口的Init方法
/// </summary>
/// <param name="context"></param>
public void Init(HttpApplication context)
...{
context.BeginRequest += new EventHandler(ReUrl_BeginRequest);//这里
}
public void Application_OnError(Object sender , EventArgs e)
...{
}
/**//// <summary>
/// 实现接口的Dispose方法
/// </summary>
public void Dispose()
...{
}
/**//// <summary>
/// 重写Url
/// </summary>
/// <param name="sender">事件的源</param>
/// <param name="e">包含事件数据的 EventArgs</param>
private void ReUrl_BeginRequest(object sender, EventArgs e)
...{
HttpContext context = ((HttpApplication)sender).Context;
//string forumPath = "";
string requestPath = context.Request.Path.ToLower();
//遍历每个url重写规则
//string strTemplateid = "";
foreach (SiteUrls.URLRewrite url in SiteUrls.GetSiteUrls().Urls)
...{
if (Regex.IsMatch(requestPath, url.Pattern, RegexOptions.Compiled | RegexOptions.IgnoreCase))
...{
//实际地址
//string newUrl = Regex.Replace(requestPath.Substring(context.Request.Path.LastIndexOf("/")), url.Pattern, url.QueryString, RegexOptions.Compiled | RegexOptions.IgnoreCase);
string newUrl = Regex.Replace(context.Request.Path, url.Pattern, url.QueryString, RegexOptions.Compiled | RegexOptions.IgnoreCase);
//HttpContext.Current.Response.Write(context.Request.Path + "<br/>" + url.Pattern + "<br/>" + url.QueryString + "<br/>");
//HttpContext.Current.Response.Write(url.Page + "<br/>" + newUrl);
//HttpContext.Current.Response.End();
context.RewritePath("/" + url.Page, string.Empty, newUrl);
return;
}
}
context.RewritePath("/" + requestPath);
}
}
/**//// <summary>
/// 站点伪Url信息类
/// </summary>
public class SiteUrls
...{
内部属性和方法#region 内部属性和方法
private static object lockHelper = new object();
private static volatile SiteUrls instance = null;
string SiteUrlsFile = HttpContext.Current.Server.MapPath("~/xml/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();
XmlDocument xml = new XmlDocument();
xml.Load(SiteUrlsFile);
XmlNode root = xml.SelectSingleNode("urls");
foreach(XmlNode n in root.ChildNodes)
...{
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);
Urls.Add(new URLRewrite(name.Value, pattern.Value, page.Value.Replace("^", "&"), querystring.Value.Replace("^", "&")));
}
}
}
}
#endregion
public static SiteUrls GetSiteUrls()
...{
if (instance == null)
...{
lock (lockHelper)
...{
if (instance == null)
...{
instance = new SiteUrls();
}
}
}
return instance;
}
public static void SetInstance(SiteUrls anInstance)
...{
if (anInstance != null)
instance = anInstance;
}
public static void SetInstance()
...{
SetInstance(new SiteUrls());
}
/**//// <summary>
/// 重写伪地址
/// </summary>
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;
}
}
#endregion
构造函数#region 构造函数
public URLRewrite(string name, string pattern, string page, string querystring)
...{
_Name = name;
_Pattern = pattern;
_Page = page;
_QueryString = querystring;
}
#endregion
}
}
}
urls.config文件:
<?xml version="1.0" encoding="utf-8" ?>
<urls>
<rewrite name="rss"
path="/rss-{0}.aspx"
pattern = "/rss(-(/d+))?.aspx"
page="/rss.aspx"
querystring="ID=$2" />
</urls>