自己用IHttpModule接口写的URL重写组件

关键字:IHttpModule接口,asp.net2.0,url重写

1,rewriter.cs源文件
+展开
-C#
using System.Xml;
using System.Web;
using System.Text.RegularExpressions;
namespace ShowBoRewriter
{
    /// <summary>
    /// URL重写类
    /// </summary>
    public class Rewriter : IHttpModule
    {
        private HttpApplication app;
        /// <summary>
        /// 释放资源
        /// </summary>
        public void Dispose()
        {}
        /// <summary>
        /// 初始化
        /// </summary>
        /// <param name="context">当前的上下文对象</param>
        public void Init(HttpApplication context)
        {
            app = context;
            app.BeginRequest += new System.EventHandler(app_BeginRequest);
        }

        private void app_BeginRequest(object sender, System.EventArgs e)
        {
            Regex[] rs;
            string[] urls;
            if (app.Context.Application["CacheRegex"] != null)
            {
                rs = (Regex[])app.Context.Application["CacheRegex"];
                urls = (string[])app.Context.Application["CacheUrls"];
            }
            else
            {
                object[] o = LoadRule();
                rs = (Regex[])o[0];
                urls = (string[])o[1];
            }
            string oldUrl = app.Context.Request.RawUrl;

            Match m;
            for (int i = 0; i < rs.Length; i++)
            {
                if (rs[i].IsMatch(oldUrl))
                {
                    m = rs[i].Match(oldUrl);
                    string newUrl = string.Format(urls[i], GetParams(m.Groups));
                    app.Context.RewritePath(newUrl);
                    return;
                }
            }
        }
        private string[] GetParams(GroupCollection mc)
        {
            string[] args = new string[mc.Count - 1];
            for (int i = 1; i < mc.Count; i++)
            {
                args[i - 1] = mc[i].Value;
            }
            return args;
        }
        private object[] LoadRule()
        {
            XmlDocument doc = new XmlDocument();
            doc.Load(app.Server.MapPath("~/bin/rule.xml"));
            XmlNodeList nl = doc.GetElementsByTagName("rule");
            Regex[] rs = new Regex[nl.Count];
            string[] urls = new string[nl.Count];
            for (int i = 0; i < nl.Count; i++)
            {
                rs[i] = new Regex(nl[i].Attributes["pattern"].Value, RegexOptions.IgnoreCase | RegexOptions.Compiled);
                urls[i] = nl[i].Attributes["url"].Value;
            }
            app.Context.Application["CacheRegex"] = rs;
            app.Context.Application["CacheUrls"] = urls;
            return new object[] { rs, urls };
        }
    }
}


2,编译为rewriter.dll文件后,设置web.config
+展开
-XML
<system.web>
   <httpModules>
      <add name="Rewritertype="ShowBoRewriter.Rewriter,Rewriter"/>
   </httpModules>
</system.web>



3,设置IIS
打开iis,右键选择需要重写的网站选择“属性”--》主目录,然后点击“配置”,在“通配符应用程序映射”下点击“插入”,可执行文件选择c:\windows\microsoft.net\framework\v2.0.50727\aspnet_isapi.dll,并且把“确认文件是否存在”的复选框勾选取消掉。
备注:需要注意你的.net版本要为2+以上。。

4,最后一步就是编写重写规则文件。
规则文件名称为rule.xml,放在bin目录下,这样修改过规则后可以重写编译网站,使规则生效。
示例规则文件如下,pattern为匹配的正则,url为需要重写到的路径及参数。
备注:注意匹配的组下表从0开始
+展开
-XML
<?xml version="1.0" encoding="gb2312"?>
<rules>
<rule pattern="/read(\d+)\.html$url="/rewiter/news.aspx?newsid={0}"/>
<rule pattern="/book(\d+)-(\d+)\.html$url="/rewiter/bookdetails.aspx?typeid={0}&bookid={1}"/>
</rules>

加支付宝好友偷能量挖...


原创文章,转载请注明出处:自己用IHttpModule接口写的URL重写组件

评论(0)Web开发网
阅读(70)喜欢(0)Asp.Net/C#/WCF