不用组件的url重写(适用于较大型项目)

网上很多关于url重写的教程都推荐下载某某某组件,

我个人不喜欢这样,即使是M$的组件也一样,因为我们干程序员的,越贴近真相越好

那么我也写一个关于url重写的文章,希望对和我一样有个性的coder们有点帮助

 

先在网站根目录下建立一个config文件夹,再在此文件架下建立一个urls.config文件,这里记录url的配置信息代码如下

Code
<?xml version="1.0" encoding="utf-8"?>
<urls>
  <rewrite name="default"
      path="/default-{0}-{1}.aspx"
      pattern = "/default-(\d+)(-(\d+))?.aspx"
      page="/default.aspx"
      querystring="id=$1^page=$3" />
</urls>

 我这里只写了一种规则

 

然后修改网站的web.config文件,修改后的代码为

Code
<?xml version="1.0"?>
<configuration>
    <appSettings/>
    <connectionStrings/>
    <system.web>
        <authentication mode="Windows"/>
        <httpModules>
            <add type="my.Forum.HttpModule" name="HttpModule"/>
        </httpModules>
        <compilation debug="true"/></system.web>
    <!-- 
        在 Internet 信息服务 7.0 下运行 ASP.NET AJAX 需要 system.webServer
        节。对早期版本的 IIS 来说则不需要此节。
    -->
    <system.webServer>
        <validation validateIntegratedModeConfiguration="false"/>
        <modules>
            <add type="my.Forum.HttpModule" name="HttpModule"/>
        </modules>
    </system.webServer>
</configuration>

本来只写一个

<httpModules>
     <add type="my.Forum.HttpModule" name="HttpModule"/>
</httpModules>

就可以了,我这里写了两个主要是为了演示如何兼容IIS7

 

然后在解决方案下新建一个项目(类库),起什么名字无所谓,主要是这个项目下一定要有一个命名空间为my.Forum的类文件

具体代码我贴出来   详细的解释我都写在注释里了

 

Code
//用到的命名空间
using System;
using System.Diagnostics;
using System.Threading;
using System.Web;
using System.Xml;
using System.Text.RegularExpressions;
using System.IO;

//注意名称空间
namespace my.Forum
{
    //继承自IHttpModule接口
    public class HttpModule : System.Web.IHttpModule
    {
        /**//// <summary>
        /// 实现接口的Init方法
        /// </summary>
        /// <param name="context"></param>
        public void Init(HttpApplication context)
        {
            //建立个委托让他执行下面的ReUrl_BeginRequest事件
            context.BeginRequest += new EventHandler(ReUrl_BeginRequest);
        }
        /**//// <summary>
        /// 实现接口的Dispose方法
        /// </summary>
        public void Dispose()
        {
        }
        private void ReUrl_BeginRequest(object sender, EventArgs e)
        {
            HttpContext context = ((HttpApplication)sender).Context;
            string requestPath = context.Request.Path.ToLower();
            //SiteUrls是下面的一个类,这里大家可以重构下
            foreach (SiteUrls.URLRewrite url in SiteUrls.GetSiteUrls().Urls)
            {
                //是否找到了匹配选项
                if (Regex.IsMatch(requestPath, url.Pattern, RegexOptions.None | RegexOptions.IgnoreCase))
                {
                    //开始替换成我们程序能读懂的url
                    string newUrl = Regex.Replace(requestPath.Substring(context.Request.Path.LastIndexOf("/")), url.Pattern, url.QueryString, RegexOptions.None | RegexOptions.IgnoreCase);
                    //这里你可以输出一下看看
                    //context.Response.Write(url.Page + "<br>" + newUrl+"<br>");
                    //开始把用户便于记忆的URL替换成程序能读懂的url
                    context.RewritePath(url.Page, string.Empty, newUrl);
                }
            }
        }
    }
    public class SiteUrls
    {
        //定义成volatitle类型主要是为了多线程访问方便,在这个示例程序中没什么实际意义,项目大了就有用了
        private static volatile SiteUrls instance = null;
        string UrlsFile = HttpContext.Current.Server.MapPath("/config/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();
            //以XML个数读取那CONFIG文件
            XmlDocument urlconfig = new XmlDocument();
            urlconfig.Load(UrlsFile);
            XmlNode root = urlconfig.SelectSingleNode("urls");
            foreach (XmlNode n in root.ChildNodes)
            {
                //XmlNodeType.Comment如果不是注释
                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);
                        //压进去的都是url实体类
                        Urls.Add(new URLRewrite(name.Value, pattern.Value, page.Value.Replace("^", "&"), querystring.Value.Replace("^", "&")));
                    }
                }
            }
        }
        //用方法实例化
        public static SiteUrls GetSiteUrls()
        {
            if (instance == null)
            {
                instance = new SiteUrls();
            }
            return instance;
        }
        url实体类#region url实体类
        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
        }
        #endregion
    }
}

 

文章写到这里就完了,

现在访问http://localhost/Default-1-1.aspx就可以接收到id为1  page为1的参数了

具体的规则可以自己设置

我已经把示例文件传到网上了可以点这里下载

本文参考了discuz的代码

补充在类SiteUrls中用到了单件模式(设计模式)因为此文不是谈设计模式,这里就不细说了

时间: 2024-08-02 14:57:09

不用组件的url重写(适用于较大型项目)的相关文章

在线部署web项目(适用于较大型项目)

 相信有的程序员已经看到这个功能,或者要开发这个功能了, 项目开发好,要交付客户的时候,怎么样最简便的部署呢. 只要把需要的文件上传到FTP空间上,然后运行xxx.aspx,按提示步骤.操作完成后,项目就部署好并可以正常的运行了. 是不是很方便?那么我们就看看这个功能是怎么开发的   一 在web根目录下建立一个目录叫install好了, 然后在此目录下建立index.aspx, 给出一些基本的提示,如欢迎安装某某某系统之类的, 然后有个按钮,跳转到真正的安装程序   二 现在开始正式部署项目,

二:理解ASP.NET的运行机制(例:基于HttpHandler的URL重写)

url重写就是把一些类似article.aspx?id=28的路径重写成 article/28/这样的路径 当用户访问article/28/的时候我们通过asp.net把这个请求重定向到article.aspx?id=28路径有两种方法可以做这件事情 一:基于HttpModule的方案这个方案有有缺点,具体缺点以后再谈我曾写过一篇文章<不用组件的url重写(适用于较大型项目) >就是按这个模式写的 二:基于HttpHandler的方案我们这个例子就是按这个方案做的我们接下来就按这种方式做这个例

重提URL Rewrite(2):使用已有组件进行URL Rewrite

可能已经没有人会使用上一篇文章中的方法进行URL Rewrite了,因为提供URL Rewrite的组件早已铺天盖地了. ASP.NET级别的URL Rewrite组件的原理很简单,其实只是监听BeginRequest事件,并且根据配置来决定目标URL.在我之前接触过的项目中,发现使用URLRewriter作为URL Rewrite组件的频率非常高,我想可能是因为那是微软提供的东西吧. 如果要使用URLRewriter,首先自然就是在web.config中配置一个HttpModule: <htt

asp.net用url重写URLReWriter实现任意二级域名 高级篇_实用技巧

 我最近写了个小例子,大家可以先看这个,里面有小例子的完整代码下载 http://www.jb51.net/article/20906.htm 好久没有写技术文章,如果大家看不明白,就多看几篇,汗,或者,在文章的后面回复(这是最有效的办法),我会尽力帮助大家解答疑惑. 来找这篇文章的,应该都知道什么叫二级域名吧,废话就不说了.但是讨论前,先要明白一个思想问题.很多朋友一直考虑不清(我前几天也一直搞不明白)的问题是,我键入一个地址后,怎么这个url就被重写了?第一步:在浏览器键入了一个地址,比如h

asp.net用url重写URLReWriter实现任意二级域名第1/2页_实用技巧

好久没有写技术文章,如果大家看不明白,就多看几篇,汗,或者,在文章的后面回复(这是最有效的办法),我会尽力帮助大家解答疑惑. 来找这篇文章的,应该都知道什么叫二级域名吧,废话就不说了.但是讨论前,先要明白一个思想问题. 很多朋友一直考虑不清(我前几天也一直搞不明白)的问题是,我键入一个地址后,怎么这个url就被重写了? 第一步:在浏览器键入了一个地址,比如http://love.kerry.com,点回车后,都发生了什么? 为了把问题简单化,我来这样解释: 第二步:首先,键入的地址被解析,最终来

跳楼求救,关于IIS URL重写分页问题

问题描述 我现在用IonicsIsapiRewriteFilter(iirf)iisurl重写,碰到情况是用aspnetpage分页控件没办法分页,只会跳到第一个页面,请大侠门救救小弟,谢谢! 解决方案 解决方案二:该回复于2012-04-05 10:40:05被版主删除解决方案三:大侠们求救啊解决方案四:救命啊解决方案五:IonicsIsapiRewriteFilter(iirf)怎么写301重定向,我现在碰到问题是google收入同一个页面多次,并且地址不一样,导致网站出问题,现在要将不同的

IIS URL重写模块和ASP.NET路由组件比较

随着针对IIS 7.0的URL重写模块的发布,以及在.NET框架3.5 SP1中包含了ASP.NET路由(Routing),许多ASP.NET开发人员开始质问这两种特性彼此间的关系,以及应该何时使用. Ruslan Yakushev在LearnIIS.NET上发表了一篇很有指导意义的文章. 二者本质的区别在于:IIS URL重写的处理方式比ASP.NET路由在层次上更低,对于客户端是不可见的. Ruslan给出了IIS 7 URL重写过程的可视化工作流.你可以看到URL重写模块是在请求被传递到请

asp.net不用设置iis实现url重写

 说到不用设置iis,主要是为了实现在虚拟主机或是拿不到iis操作限的时候,不能添加isap又想实现类似于静态化的程序实现方式,先声明,这里最终要实现的效果是,最终可以用12345.html替换show.aspx?id=12345这样的地址访问功能,支持任意扩展名及无扩展 程序要调整的部分只有两块. 一是web.config文件. 二是链接地址. 所需urlrewrite.dll   首先下载URLRewriter:http://download.microsoft.com/download/0

asp.net不用设置iis实现url重写 类似伪静态路由_实用技巧

程序要调整的部分只有两块.一是web.config文件.二是链接地址.所需urlrewrite.dll 首先下载URLRewriter:http://download.microsoft.com/download/0/4/6/0463611e-a3f9-490d-a08c-877a83b797cf/MSDNURLRewriting.msi 下载安装后再bin目录下找到URLRewriter.dll文件 好了开始实施.第一步:将urlrewrite.dll下载到你的web程序目录里去.哪都行.我是