一个UrlRewrite自定义规则

都是在web.config里配置访问规则在路由到实际页面,所以先实现自定义节点信息读取,这里我定义了俩个类,贴出详细信息

show sourceview sourceprint?

namespace UrlRewrite
{
    public class UrlRewriteConfigGroup : ConfigurationSectionGroup
    {
        [ConfigurationProperty("rules")]
        public UrlRewriteConfig Rules
        {
            get
            {
                return (UrlRewriteConfig)base.Sections["rules"];
            }
        }
    }
}

 

  

show sourceview sourceprint?

namespace UrlRewrite
{
    public class UrlRewriteConfig : ConfigurationSection
    {
        [ConfigurationProperty("enable", DefaultValue = false)]
        public bool Enable
        {
            get
            {
                return (bool)base["enable"];
            }
        }
  
        [ConfigurationProperty("suffix", DefaultValue = ".html")]
        public string Suffix
        {
            get
            {
                return (string)base["suffix"];
            }
        }
  
  
        [ConfigurationProperty("", IsDefaultCollection = true)]
        public RulesElectionCollection Rules
        {
            get
            {
                return (RulesElectionCollection)base[""];
            }
        }
  
    }
  
    public class UrlRewriteConfigRule : ConfigurationElement
    {
        [ConfigurationProperty("form")]
        public string Form
        {
            get
            {
                return (string)base["form"];
            }
        }
        [ConfigurationProperty("to")]
        public string To
        {
            get
            {
                return (string)base["to"];
            }
        }
        [ConfigurationProperty("query")]
        public string Query
        {
            get
            {
                return (string)base["query"];
            }
        }
    }
  
    public class RulesElectionCollection : ConfigurationElementCollection
    {
        protected override ConfigurationElement CreateNewElement()
        {
            return new UrlRewriteConfigRule();
        }
  
        protected override object GetElementKey(ConfigurationElement element)
        {
            return ((UrlRewriteConfigRule)element).Form;
        }
    }
  
    public static class UrlRewriteConfigHelp
    {
        public static bool Enabled
        {
            get
            {
                UrlRewriteConfig section
                    = ConfigurationManager.GetSection("rulesGroup/rules")
                    as UrlRewriteConfig;
                if (section == null)
                {
                    return false;
                }
                return section.Enable;
            }
        }
  
        public static string Suffix
        {
            get
            {
                UrlRewriteConfig section
                    = ConfigurationManager.GetSection("rulesGroup/rules")
                    as UrlRewriteConfig;
                if (section == null)
                {
                    return ".html";
                }
                return section.Suffix;
            }
        }
  
  
        public static RulesElectionCollection Rules
        {
            get
            {
                UrlRewriteConfig section
                    = ConfigurationManager.GetSection("rulesGroup/rules")
                    as UrlRewriteConfig;
                if (section == null)
                {
                    throw new System.InvalidOperationException("未能获取rulesGroup/rules");
                }
                return section.Rules;
            }
        }
  
        public static string RewriteBase
        {
            get
            {
                string path = HttpContext.Current.Request.ApplicationPath;
                if (!path.EndsWith("/"))
                {
                    return path + "/";
                }
  
                return path;
            }
        }
  
    }
  
}

 

  

这里定义了组,不需要的话可以把UrlRewriteConfigGroup类去掉并修改配置节点,在UrlRewriteConfig类里又定义了UrlRewriteConfigHelp帮助类获取节点信息...

然后实现IHttpModule实现重写

show sourceview sourceprint?

namespace UrlRewrite
{
    public class UrlRewrite : IHttpModule
    {
  
        #region IHttpModule 成员
  
        public void Dispose()
        {
            throw new NotImplementedException();
        }
  
        public void Init(HttpApplication context)
        {
            context.BeginRequest += new EventHandler(Application_BeginRequest);
            //context.PreRequestHandlerExecute += new EventHandler(Application_PreRequestHandlerExecute);
        }
  
        void Application_BeginRequest(object sender, EventArgs e)
        {
            HttpContext context = HttpContext.Current;
  
            // 取得当前请求的路径
            string path = context.Request.Path;
  
            string suffix = String.Empty;
            if (UrlRewriteConfigHelp.Enabled)
                suffix = UrlRewriteConfigHelp.Suffix;
  
            // 遍历所有的映射规则,进行映射处理 
            foreach (UrlRewriteConfigRule rule in UrlRewriteConfigHelp.Rules)
            {
                Regex regex = new Regex("^" + rule.Form + suffix + "$", RegexOptions.IgnoreCase);
                Match match = regex.Match(path);
                if (match.Success)
                {
                    string trueUrl = UrlRewriteConfigHelp.RewriteBase + rule.To;
  
                    context.Items["OriginalUrl"] = context.Request.RawUrl;
  
                    if ("POST".Equals(context.Request.HttpMethod))
                        trueUrl = trueUrl.Substring(0, trueUrl.LastIndexOf("?"));
                    else
                    {
                        int count = match.Groups.Count;
  
                        if (count > 1 && match.Groups[1].Value != "")
                        {
                            for (int i = 1; i <= count; i++)
                            {
                                trueUrl = trueUrl.Replace("$" + i, match.Groups[i + 1].Value);
                            }
                        }
                    }
  
                    context.RewritePath(trueUrl);
                    return;
                }
            }
  
            //context.RewritePath("/error.htm");
        }

 

  

然后就可以访问了

这里from的action生成的是实际的地址,为了能让form生成请求的地址要重写form的action生成,这里定义了一个form.browser文件和一个FormRewriterControlAdapter类

show sourceview sourceprint?

namespace UrlRewrite
{
    public class FormRewriterControlAdapter :
        System.Web.UI.Adapters.ControlAdapter
    {
        protected override void Render(HtmlTextWriter writer)
        {
            base.Render(new RewriteFormHtmlTextWriter(writer));
        }
    }
  
    public class RewriteFormHtmlTextWriter : HtmlTextWriter
    {
        public RewriteFormHtmlTextWriter(HtmlTextWriter writer)
            : base(writer)
        {
            this.InnerWriter = writer.InnerWriter;
        }
  
        public RewriteFormHtmlTextWriter(TextWriter writer)
            : base(writer)
        {
            this.InnerWriter = writer;
        }
  
        public override void WriteAttribute(string name, string value, bool fEncode)
        {
            if (name == "action")
            {
                HttpContext context = HttpContext.Current;
  
                if (context.Items["ActionAlreadyWritten"] == null)
                {
                    value = context.Items["OriginalUrl"] as string;
                    context.Items["ActionAlreadyWritten"] = true;
                }
            }
  
            base.WriteAttribute(name, value, fEncode);
        }
    }
}

 

  

form.browser文件代码

<!--

可在 <windir>Microsoft.NETFramework<ver>CONFIGBrowsers 中找到现有的浏览器定义

-->

<browsers>

  <browser refID="Default">

    <controlAdapters>

      <adapter controlType="System.Web.UI.HtmlControls.HtmlForm"

               adapterType="UrlRewrite.FormRewriterControlAdapter" />

    </controlAdapters>

  </browser>

</browsers>

整体截图

另外web.config中

<rules enable="true" suffix=".ygm">

      <add form="(/|/default|/index)" to="view/user/index.asp教程x"/>

      <add form="/u/user(_(d+))*" to="view/user/user.aspx?id=$1" />

    </rules>

enable设置为true启动带后缀的访问,suffix设置后缀名,可以随便起

设置后访问截图

由于没怎么用过urlrewrite重写和.net下正则也比较生疏所以折腾

时间: 2024-09-30 13:27:28

一个UrlRewrite自定义规则的相关文章

java编程排序之内置引用类型的排序规则实现,和自定义规则实现+冒泡排序运用

第一种排序:[冒泡排序]基本数据类型的排序. [1]最简易的冒泡排序.效率低.因为比较的次数和趟数最多. 1 /** 2 * 最原始的冒泡排序. 3 * 效率低. 4 * 因为趟数和次数最多.都是按最大化的循环次数进行循环 5 * @Title: sort 6 * @Description: TODO(这里用一句话描述这个方法的作用) 7 * @param arr 8 * @return void 返回类型 9 * @author 尚晓飞 10 * @date 2014-8-5 上午8:42:4

求资源- 求一个简单自定义的框,右上角需要关闭框的叉。最简单的,不需要样式的。

问题描述 求一个简单自定义的框,右上角需要关闭框的叉.最简单的,不需要样式的. 我需要自己写一个框,里面可以写内容,最简单的就行.可以不需要样式. 解决方案 easyDialog v2.0 http://stylechen.com/easydialog-v2-0.html 解决方案二: artDialog:http://demo.jb51.net/js/2011/artDialog/_doc/labs.html 解决方案三: 不需要插件的有没,纯自己写的那种,最简单的就可以.

静态分析-请问有大神知道如何自定义规则对代码进行静态检查么?

问题描述 请问有大神知道如何自定义规则对代码进行静态检查么? 请问有大神知道如何自定义规则对代码进行静态检查么?一直想根据自己的编程规则集,指定适合自身的分析工具. 解决方案 不知道你说的是什么的静态检查,代码分析工具么?

findbugs自定义规则怎么确定for循环的边界

问题描述 findbugs自定义规则怎么确定for循环的边界 我主要是要检测for循环里面是否进行了数据交换,但是不知道该怎么确定for循环的边界. package edu.umd.cs.findbugs.detect; import edu.umd.cs.findbugs.BugInstance; import edu.umd.cs.findbugs.BugReporter; import edu.umd.cs.findbugs.bcel.OpcodeStackDetector; import

项目中布局文件怎么引用另一个项目自定义的组件

问题描述 项目中布局文件怎么引用另一个项目自定义的组件 如果我在一个项目里自定义了一个组件,我想在另一个项目的布局文件中加入这个组件,怎么配置呢?怎么让布局文件能够找到这个组件呢? 解决方案 参考这个例子:http://www.yiibai.com/android/simple_android_custom_component_using_xm.html 解决方案二: xml中include

我想从一个网页上获取一个JS自定义空间怎么做?

问题描述 在一个网页上有一个JS的自定义panle,但是我看不懂原代码.请问高手我该怎么弄到他??在线等答案.. 解决方案 解决方案二:看不懂??那至少要知道如何调用函数...这个JS要实现什么!!解决方案三:http://extjs.com/deploy/dev/examples/portal/portal.html我想要这个上面的panel控件...解决方案四:看不到还是看不懂啊看不到的话直接全部保存就能得到js文件了看不懂的话要麻烦一点得学习一下javascript,...

【java规则引擎】一个基于drools规则引擎实现的数学计算例子

最近在研究JBPM工作流引擎,发现JBPM是基于Drools的,官方文档查看得知Drools是一款规则引擎.兴趣之下,仔细了解了下 Drools,Drools作为JBoss出品的一款开源推理和规则引擎,被广泛的应用在各个领域,如JBPM也是基于Drools的.一般我们使用规则 引擎的前提和场景是:业务规则频繁变化!如果业务规则稳定则无需应用规则引擎的,实际中诸如移动通信商.银行等领域则广泛的使用了规则引擎,主要是为了适 应频繁变更的规则,但又不需要影响业务逻辑代码. 在看了官方的一些文档介绍后,

一个关于自定义3级域名的问题

问题描述 大家好,我现在有这样一个需求.在我们本地有一个服务假设他得域名是http://www.test.com/ 我想实现的功能是假设用户访问的链接是http://www.test.com/tiyan 或者http://www.test.com/tiyan/xxx 的把请求动转发到另外一个服务器中,假设用户访问的是http://www.test.com/tiyan 而实际访问的是http://192.168.1.2/xxx 请问有人解决过这个问题吗?这个问题如何解决. 谢谢大家了. 问题补充:

求助:谁帮我做一个C#自定义日历控件 有报酬

问题描述 这样既可有谁帮一下谢谢jiaQQ578304638 解决方案 解决方案二: 解决方案三:网上很多事例,搜一个