前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >不用组件的url重写(适用于较大型项目)

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

作者头像
liulun
发布2022-05-08 17:42:10
4130
发布2022-05-08 17:42:10
举报
文章被收录于专栏:liulunliulun

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

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

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

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

代码语言:javascript
复制
<?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文件,修改后的代码为

代码语言:javascript
复制
<?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的类文件

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

代码语言:javascript
复制
//用到的命名空间
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中用到了单件模式(设计模式)因为此文不是谈设计模式,这里就不细说了

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2008-08-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档