QBlog官方博客

本博将记录与秋色园成长相关的历史路程及秋色园的开发进展等相关情况。
公告信息
欢迎光临秋色园官方博客,欢迎:下载与使用CYQBlog系统,并提出您的意见与建议。
文章档案
文章
秋色园QBlog技术原理解析:UrlRewrite之无后缀URL原理(三)
2011/2/18 20:25:46

文章回顾:

1: 秋色园QBlog技术原理解析:开篇:整体认识(一) --介绍整体文件夹和文件的作用

2: 秋色园QBlog技术原理解析:认识整站处理流程(二) --介绍秋色园业务处理流程

本节,将从 秋色园 的整站入口:UrlRewrite.dll入手解析无后缀原理。

鉴于园子里有很多UrlRewrite的文章,因此就不略为简单的讲解了:

一:用ISAPI筛选器:即网上第三方发布的比较常见的,如:RewriteEval.dll

秋色园早期的版本始于2007,使用的就是第三方的插件,随着创业公司的结束,沉默了2年。

回顾当年参与开发博客的一共有这么几种角色:

1:技术总监负责指导我写CYQ.Data,和指导另两名选手外挂js和中文转拼音,同时写了个页面基类

2:我负责博客用户后台,另一同事负责写博客前台

3:一女同事负责写js外挂

4:2个美工负责写了好几套模版

5:另一个同事折腾了个中文转拼音的。

6:一共花了3个月左右的时间,开发了出来。

以前7个人干的活,现在,我一个人干了,知道我有多不容易了吧。

2009年时,随着CYQ.Data的二次小改进,打算搭建个人博客,顺便把它更换数据层,却发现,实在是改不动,一个业务类就上万行代码,同事那“复制+粘贴”的强大,表现的是相当的淋漓尽致。

因此只好放弃改动,只删除一些不要的功能,然后重新定位了下URL,简单改造成单用户博客,还弄了个空间域名51xxdn,便宜没好货,150/一年的服务器三天两头就打不开,一天到晚是和客服沟通。一年后站点到期后我就扔了,连备案过的域名也不要了。

当年使用第三方插件时,遇到麻烦的地方:

需要把dll提交给客服,然后还要教客服的技术人员怎么添加,最可怕的是还要重启IIS才生效。

人家一个服务器放那么多网站,咋能随随便便的让要求重启IIS呢?可是不重启你的站点又又打不开,所以每次还要挑无中午吃饭的时间重启,重启后还是不行,不行咋折腾?过了一会客服技术又说行了,勉强运行了起来,后来发现该服务器还是相当的经常性的重启IIS,因为站点老是打不开。

还有每次修改代码修改或增加URL规则时,又得叫人家重启下IIS,唉,那个折腾,人家也折腾。

新版本的秋色园,为了避免这种情况,自然得使劲的考虑把它给弄掉,于是重写还是自己来。

二:IHttpModule的RewritePath方法

自己来,怎么来?用C++写个ISAPI会不会?答:不会。

还是老实的用.net写好了。

那就来点简单的了:从Global.asax折腾到IHttpHandle,折腾了半天,搞错了方向,转来转去还是在原地,后来经地的那么一搜,才发现了,路子要走还得往IHttpModule上走。

用IHttpModule很容易,很多人都用这个折腾,写个类继承自IHttpModule,然后到配置文件里注册一下就可以了,示例如下:

1:新建类库项目:起名:UrlRewrite

2:添加引用System.Web,因为IHttpModule在这名称空间下,而类库默认是没引用这个的

3:把Class1.cs更名为UrlRewrite.cs,并让类继承自IHttpModule,实现接口,最终如下:

把着我们把代码小小调整一下如:

#region IHttpModule 成员

public void Dispose()
{
//throw new Exception("The method or operation is not implemented.");
}

public void Init(HttpApplication context)
{
context.BeginRequest += new EventHandler(context_BeginRequest);
}

void context_BeginRequest(object sender, EventArgs e)
{
HttpApplication app = (HttpApplication)sender;
HttpUrlRewrite(app.Context);
}
public void HttpUrlRewrite(HttpContext context)
{
string url = context.Request.Url.ToString();//用户请求的Url
//--这里要做很多Url逻辑处理
context.RewritePath("~/Default.aspx", null,"url="+url);

}
#endregion

上面的代码,意思为:

将整个请求的url都当成参数送到Default.aspx页面中,所有的请求都转化为Default.aspx?url=www.cyqdata.com类似的方式

下面再建一个站点,来接受并输出结果:

4:添加新建网站起名:UrlRewriteDemo

ps:本来是要建应用程序的,怕大伙下载示例时打不开,所以示例用网站形式

5:添加对UrlRewrite项目的引用

6:F5一下,调出web.config,然后在配置文件添加配置项代码如下:

< httpModules>
< add name="UrlRewrite" type="UrlRewrite.UrlRewrite,UrlRewrite" />
< /httpModules>

目前情况示例如图:

然后到Default.aspx写一行代码输出接收到的参数:

protected void Page_Load(object sender, EventArgs e)
{
Response.Write(Request["url"]);
}

一切就绪,运行,我们看结果:

图1:请求默认存在的页面,输出结果,表示很正常

图2:随便请求一个不存在页面,输出了结果,表示也很正常

图3:请求一个连后缀都没有的Url,输出了结果,表示有点惊讶

从图3看出,看来VS2005集成的IIS对所有的请求都统一处理了,所以连无后缀的也能处理

重点说明:

对于以IIS站点开发或最终部署来说,默认aspnet_isapi.dll是处理不了无后缀或图片等后缀的,因此,需要通过添加扩展“通用映射”能达到此功能。

IIS6下如何添加见:如何安装部署秋色园CYQBlog站点

从以上解析的内容可以看出,已经可以截取到用户输出的任意请求地址,包括无后缀。

那么秋色园具体是如何处理各种请求的,读取配置文件得用正则解析还是说其它?

见下篇为你解析内部实现原理,敬请关注。

最后是示例代码下载: UrlWrwriteDemo.rar

下一篇:秋色园QBlog技术原理解析:UrlRewrite之URL重定向体系(四) --介绍URL如何定位到处理程序

 

秋色园是QBlog的官方站点,由路过秋天创建,基于cyqdata数据层框架开发的支持多用户、多语言、多数据库(access,mssql,oracle)、目录级url等功能强大的博客系统
新浪微博粉丝精灵,刷粉丝、刷评论、刷转发、企业商家微博营销必备工具"
 秋色园技术原理解析    浏览(11202)    评论(23)    关键字 秋色园,qblog,cyqblog,net,博客,原理,解析,urlrewrite,url
游客[注册][221.130.252.*] : 2012/12/28 16:01:24
IIS7.5 如何添加添加通用映射?
游客[注册][14.108.155.*] : 2012/5/23 23:45:17
最早认识秋天是在2010年12月份吧,之后我离职换了几份不是开发的工作。今年初,又找了份做软件的工作。那时候秋天在银光中国网上发表的Silverlight象棋游戏开发。我差不多按照你的教程练习了一遍。所以对秋天印象深刻。秋天应该是自己创业了吧,祝你事业有成!
skydun[115.174.14.*] : 2011/7/9 22:15:49
哇 好厉害
skydun : 2011/7/9 16:50:36
楼主强大
kingboy2011 : 2011/6/15 9:30:25
感谢分享!!
shuhangv8 : 2011/6/14 22:17:53
讲的太好啦,又学习啦。
游客[注册][119.122.163.*] : 2011/6/3 8:28:06
这样的映射会对所有请求进行处理,包括图片,js,css等页面请求调用的所有资源。
这么做不会造成性能问题嘛。。
回复性能问题不在这里,你简单的想,一些大站都有图片防盗链,自然也得对请求映射进行处理,再想想你就知道了。
zeyoo : 2011/5/17 23:10:36
还是有点不明白,为什么URL的重定向能够创造友好的搜索引擎收录?比生成静态文件是更好抓取吗?
回复这是搜索引擎的算法决定的。
pengure : 2011/5/17 22:53:27
整个系列总算是又过了一遍,感觉比第一遍看的时候更有感觉了,基本上搞清楚了秋色园的技术原理(当然还是比较皮毛的),但是就是没有实践过,关键是自己不会搞美工,没有合适的页面就没有动力做了,呵呵
回复呵呵,上面提供的示例,最后照着做一遍,会更有感觉。
zeyoo : 2011/5/17 9:58:15
弱弱的问一个问题,URL的重定向固然好,但对于搜索引擎的抓取会不会不好?
回复强强的回复:URL的重定向意图就是为了迎合创造友好的搜索引擎收录。
zeyoo : 2011/5/16 23:35:20
现在做其他工作,根本没时间搞技术问题,看了一下,还是很有收获,先留个脚印,说不定以后能用上。感谢秋天,辛苦了!
回复呵呵,留言很积极的说~
陌香 : 2011/5/16 0:54:33
自己照着写了,也实现了,不过不大懂原理。
陌香 : 2011/5/16 0:20:46
先不下载了,自己照着做个试试看。
回复嗯,加油~有问题欢迎随时留言。
游客[注册][219.139.241.*] : 2011/5/9 4:09:32
楼主,为什么文章没有上一篇、下一篇的导航呢?这样每次我都要跑到导航页面点击,有点麻烦呀
回复去掉了,本来是有链接的,没空写功能,后来省了,哈哈。
tudas : 2011/5/5 3:10:14
这个可以将网页后缀改成.html吗
回复可以,任意后缀都可以。
游客[注册][119.138.74.*] : 2011/5/5 3:00:04
最近正在想这个问题,不过我对原理还不是很明白
回复有示例,可以下载示例再看看。
hjl19 : 2011/3/22 18:31:07
必须滴,必须滴关注
回复:) 欢迎欢迎持续的关注~
zhesi2011 : 2011/3/20 20:20:45
从今天起开始持续关注楼主!
回复从今天起我做好持续被关注的准备。哈哈~
游客[注册][124.126.6.*] : 2011/3/18 23:20:47
什么只有调试的时候好用,在IIS的时候就找不到路径了呢?
回复IIS中需要添加通用映射。
xiaoyi1234[124.126.6.*] : 2011/3/18 23:14:32
为什么我重载的时候,对于不存在的路径就不重载了呢?
回复不存在的路径,你定位到一个Error.ashx处理程序中去就可以了。
mystring : 2011/3/18 18:39:41
多谢秋色,支持
回复:) 多谢支持~~~
skyinthesea : 2011/3/2 7:55:16
图文并茂,非常好的教材啊
回复:) 争取每篇文章看到你的留言
轩辕公子[219.139.241.*] : 2011/3/2 6:24:28
呵呵,我在博客园关注楼主好久了,干些楼主的慷慨,目前正在努力学习中,希望能够早日达到楼主的水平
回复每篇文章都留言一次就对了,久了水平就上去了。
  
Copyright © 2010-2020 power by CYQ.Blog - 秋色园 v2.0 All Rights Reserved