1.首先在网站目录中建立URL重写规则的配置文件,这里存放在/Config/UrlRewrite.config文件中
<?xml version="1.0" encoding="utf-8"?> <UrlRewriteConfig> <Rules> <RewriteRule> <LookFor>/News</LookFor> <SendTo>/News.aspx</SendTo> </RewriteRule> <RewriteRule> <LookFor>/NewsInfo/(\d*)</LookFor> <SendTo>/NewsInfo.aspx?id={0}</SendTo> </RewriteRule> <RewriteRule> <LookFor>/Index</LookFor> <SendTo>/Index.aspx</SendTo> </RewriteRule> </Rules> </UrlRewriteConfig>
2.建立Module类,这里命名为UrlRewriteModule,需要实现System.Web.IHttpModule接口
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Text.RegularExpressions; using System.Web; using System.Xml.Linq; using BM.Framework; namespace BigMiao { public class UrlRewriteModule : IHttpModule { public void Init(HttpApplication context) { //开始请求时,进入自定义的方法中过滤 context.BeginRequest += delegate (object sender, EventArgs args) { RewritePath(context); }; } /// <summary> /// 重写URL /// </summary> /// <param name="context"></param> private void RewritePath(HttpApplication context) { string requestFilePath = context.Request.Path; //判断请求的路径,如果是JS,css,图片文件,则不重写 string exceptPath = requestFilePath.ToLower(); if (exceptPath.EndsWith(".js") || exceptPath.EndsWith(".css") || exceptPath.EndsWith(".png") || exceptPath.EndsWith(".jpg") || exceptPath.EndsWith(".gif")) { return; } //读取重写规则的配置文件,频繁读取使用缓存 string configDir = context.Server.MapPath("~/Config/UrlRewrite.config"); var xdoc = (CacheUtil.Instance.GetCache("UrlRewriteConfig") as XDocument) ?? XDocument.Load(configDir); var rules = from rule in xdoc.Descendants("RewriteRule") select new { LookFor = rule.Element("LookFor")?.Value, SendTo = rule.Element("SendTo")?.Value }; foreach (var rule in rules) { //使用正则匹配重写规则 var regex = new Regex("^" + rule.LookFor + "$", RegexOptions.IgnoreCase); var match = regex.Match(requestFilePath); if (match.Success) { var listKey = new List<string>(); for (var i = 0; i < match.Groups.Count; i++) { if (i > 0) listKey.Add(match.Groups[i].Value); } string realUrl = rule.SendTo.FormatWith(listKey.ToArray());//这里是对string类型的扩展,类同于String.Format("xxxx{0}xxxx", "OOOO") context.Context.RewritePath(realUrl);//重写至真实路径 break; } } } //实现IHttpModule必备方法 public void Dispose() { } } }
3.在web.config中配置HttpModule
应用程序池经典模式,在<system.web>节点内配置:
<httpModules> <!--Url重写--> <add name="UrlRewriteModule" type="BigMiao.UrlRewriteModule" /> </httpModules>
应用程序池集成模式,在<system.webServer>节点内配置:
<modules> <!--Url重写--> <add name="UrlRewriteModule" type="BigMiao.UrlRewriteModule" /> </modules>
OK,大功告成!