波仔

信息蕴藏价值
随笔 - 59, 评论 - 433, 引用 - 5

导航

关于

    I am building a portal named Starlight which are based on the Teamwork Portal(a portal I have finished, because of the name has been registered by another company I have changed the name) and DynamiceWeb.
    You can get the latest information about it here.


每月存档

最新留言

  • re:BI数据级权限解决方案
    <p>hi,你好。这个BI数据权限,很有新意。有个细节问题,想向你请教,</p> <div>StrtoSet(BI.DataSecurity.GetDimensio...
    by shenzhenjia(注册) on 2009/6/14 17:09:43
  • re:BI数据级权限解决方案
    <p>hi,你好。这个BI数据权限,很有新意。有个细节问题,想向你请教,</p> <div>StrtoSet(BI.DataSecurity.GetDimensio...
    by shenzhenjia(注册) on 2009/6/14 17:09:17
  • re: BI数据级权限解决方案
    不错,另外字符串相加建议采用StringBuilder做处理。
    by kentliu(匿名) on 2008/8/18 9:44:31
  • re: 发布一个博客软件系统——肥猫博客
    谢谢.fmblog还在不断完善中,你说的很多确实是我们需要改进的。
    by jasper(匿名) on 2008/4/24 14:38:01
  • 日啊,你这个是asp.net版么?
    你有试验过么?就在这里乱讲,你这样绝对会碰到权限cdo.message问题,最恶心的这种沽名钓誉的
    by passer(匿名) on 2007/12/10 10:07:00
  • 回复: I have a dream
    I think my dream is very simple .I just want find a good job .by the end of the fouth college year.
    by kally(匿名) on 2007/11/14 21:56:00
  • 回复: I have a dream
    I have a dream that one day every people can live on the earth with out WAR
    by w4er(匿名) on 2007/11/3 13:53:00
  • 回复: I have a dream
    no thing is diffcult
    by w4er(匿名) on 2007/11/3 13:47:00
  • 回复: 发布一个博客软件系统——肥猫博客
    肥猫博客的确是个很不错博客软件系统,但很遗憾目前还不是很适合使用,我有用过你的博客,后台操作感一流,功能的确很好,但性能不是很稳定,网站皮肤只有一个,博客皮肤稍放点大的东西上去会扭曲整个页面,看起不不...
    by 赶路人(匿名) on 2007/10/22 10:27:00
  • 回复: 比DotNetNuke更好的Portal
    有谁用过 lightPortal 吗?一个功能强大的java 开源 portal
    by jacky(匿名) on 2007/9/21 9:10:00
  • 回复: ASP.NET发送邮件
    有ASP版的吗?
    by 开心网(匿名) on 2007/8/23 16:11:00
  • 回复: ASP.NET发送邮件
    有ASP版的吗? 有的话不错
    by 开心网(匿名) on 2007/8/23 16:11:00

  • 我 <br>地联 系电话好像是13651765786,号179447907
    by 王竟华(匿名) on 2007/8/8 15:19:00
  • 回复: I have a dream
    i have a dream <br>that is i will happiness all my life
    by Joy(匿名) on 2007/6/28 17:58:00
  • 回复: I have a dream
    I have a dream that i can do anything.
    by aaronnorman(匿名) on 2007/6/17 11:09:00

广告

 

UrlRewriter是我们现在做博客系统基本上必用的功能,除了对搜索引擎友好外,人也比较容易记,看着也舒服。关于UrlRewriter的文章其实也是非常多,由于有网友提出想了解肥猫博客使用的UrlRewriter技术,因此这里主要针对在肥猫博客中使用的UrlRewriter技术做一个介绍。这个实现主要是针对ASP.NET 1.1体系的,可能你要说ASP.NET 2.0都出来了,还要谈1.1,可是我一直用的是1.1,也没有接触过2.0,所以针对ASP.NET 2.0UrlRewriter技术不在这里阐述。

 

UrlRewriter有多种实现方式,常用的有:HttpModuleHttpHandlerApplication_BeginRequest方式处理。对于前2种,现在都有很成熟的解决方法,比较有名的就是UrlRewriter.NET,我建议你如果要用到UrlRewriter首先就应该优先考虑这种成熟的解决方案。UrlRewriter.NET在这里不作介绍。

在肥猫博客中,我使用的是Global.ascx文件中的Application_BeginRequest方式。对于这种方式,我们需要做3个工作:

1.         定义UrlRewriter的重写方式,一般这可以是一个xml文件来定义你需要用到的所有重写URL

该文件的内容大致如下:

<?xml version="1.0" encoding="utf-8" ?>

<pages>

    <page name="" url="^/admin(.*)$" rewriter="/admin$1" />

    <page name="" url="^/control(.*)$" rewriter="/control$1" />

 

    <page name="" url="^/([A-Za-z0-9]+)/default\.aspx$" rewriter="/default.aspx?m=$1" />

    <page name="BlogHome" url="^/([A-Za-z0-9]+)/blog/default\.aspx$" rewriter="/blog/default.aspx?m=$1" />

</pages>

       这个文件中最主要的定义是urlrewriter,其他的都是程序中辅助用到的字段。url定义的是友好的地址,比如:http://www.fmblog.cn/jasper/feed/default.aspx,而rewriter定义的则是根据这个友好地址如何生成对应的实际地址,比如上面那个友好地址对应的实际地址为:http://www.fmblog.cn/feed/default.aspx?m=jasper

       所有系统中用到的重写url都必须实现定义好,而且我建议用到正则表达式来定义。

2.       使用HttpContext.Current.RewritePath(url)方法来将友好地址变成实际地址

有了上面第一步的url定义,接着就在Global.ascxApplication_BeginRequest方法中将友好地址转变为实际地址。

            foreach(fmblog.Data.Config.UrlRule item in fmblog.Data.Config.Url.Rules)

            {

                Regex regex = new Regex(item.Url, RegexOptions.IgnoreCase);

 

                if(regex.IsMatch(Request.RawUrl))

                {

                    string url = regex.Replace(Request.RawUrl, item.Rewriter);

 

                    HttpContext.Current.RewritePath(url);

                   

                    return;

                }

            }

这个方法很简单,fmblog.Data.Config.Url.Rules读取的就是第1步中的所有url重写规则,我们看这个方法就是很简单的把实际地址得到后,进行了一个RewritePath操作,这样就完成了我们需要的重写功能。不过,这会带来一个小问题。

3.         带来的小问题就是所有HtmlFormAction都是实际地址,而不是友好地址

为了解决这个HtmlFormAction问题,我们需要自己写一个MyFormHtmlForm继承过来,并且在输出的时候,将action改成我们需要的实际地址。这个我们通过重载MyFormRenderAttributes方法实现,如下所示:

        protected override void RenderAttributes(System.Web.UI.HtmlTextWriter writer)

        {

            writer.WriteAttribute("name", this.Name);

            base.Attributes.Remove("name");

 

            writer.WriteAttribute("method", this.Method);

            base.Attributes.Remove("method");

 

            this.Attributes.Render(writer);

 

            writer.WriteAttribute("action", this.Page.Request.RawUrl);

            base.Attributes.Remove("action");

 

            if (base.ID != null)

            {

                writer.WriteAttribute("id", base.ClientID);

            }

        }

 

然后将页面上用到的Form都改成这个MyForm就好了。

 

这种实现方式,还有1个小问题,就是登陆转向的问题。如果你没有登陆,但是访问了一个需要登陆认证的页面,在ASP.NET中会自动将你导航到登陆页面,并且在登陆后会重定向到需要访问的页面。

 

如果你的后台页面也用到了UrlRewriter,那么转向登陆页面后,其Url就会变成实际地址。如果要解决这个问题,请采用其他的方法,比如UrlRewriter.NET。在肥猫博客中,后台页面都是使用的实际页面,所以为了控制代码我们采用了这种自己写代码的简单处理方式。

其实,UrlRewriter现在是一个很成熟的东西,网上有很多内容肯定能够符合你的需求,这里只是简单的介绍一个可行的方案,还有其他很多成熟方案可以采用,所以在使用UrlRewriter之前,先在网上找些资料好对症下药。

不管怎样,最简单的还是直接使用成熟的UrlRewriter控件。

 

打印 | 张贴于 2007-01-16 17:54:00 | Tag:暂无标签

留言反馈

#【转】也说UrlRewriter 编辑
UrlRewriter是我们现在做博客系统基本上必用的功能,除了对搜索引擎友好外,人也比较容易记,看着也舒服。关于UrlRewriter的文章其实也是非常多,由于有网友提出想了解肥猫博客使用的UrlR...
2007-02-28 11:08:00 | [匿名:mbskys]
#回复: 也说UrlRewriter 编辑
在asp.net 2.0中如果使用HttpModule或HttpHandler,可以用
BuildManager.CreateInstanceFromVirtualPath来解决HtmlForm的Action的问题
2007-01-17 17:43:00 | [匿名:Joad]
#回复: 也说UrlRewriter 编辑
我的免费分页控件 AspNetPager 6.0.0 for Vs2005的示例项目中用的也是这个控件,很方便的说。
2007-01-17 09:44:00 | [匿名:Webdiyer]
对不起,目前本随笔不允许发表新评论.

Powered by: Joycode.MVC引擎 0.5.2.0