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
}
}
}
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>