作者:Scott Mitchell
翻译:Janssen
1.0.请一定要抱着争论的情态来看该文章

1.1. 概要
解析哪些采用微软提供的ASP.NET来对动态爆发的U大切诺基L地址进行网址重写。网站重写是兑现一种截取网址央求并将其进行拍卖后重新指向到一个点名的网站的历程。作者本身在对种种达成网站重写的才干进行商量和追究后得出的经历和措施,希望能对你有所帮忙。

1.2. 内容简要介绍
稍微花点时间看一看你做的网址内部的U奥德赛L地址,你看看类似那样的地点吗
?可能你会由于某种目标把多量的页面文件从三个索引以致多个网址更换成其余地方,而众多访问者出于个人兴趣可能商讨指标从前就已经将原有网址收藏了起来,
假诺那时她从收藏夹张开该页面包车型地铁时候开采这已经是坏链了。本文目的在于介绍怎么着利用网站重写将那几个“难看”的网站转换到比较有实际意义的网站,使其便利纪念。比如将
dispEmployeeInfo/459-099/summary.html
。大家照旧开采网站重写手艺能够减轻令人脑仁疼的404谬误,或许说它能够创设三个智能化的404荒谬解决方案。
总的看,网站重写是促成一种截取网站须求并将其张开管理后再度指向到三个点名的网站的进程。在网站重写实行的中间,相应管理程序管理被呼吁的网站,从中提抽取相关的值,然后再度指向贰个新的钦定地方。譬如:由于贰次网址目录调治,原有的
/people/
子目录下的保有网页全体运动到/info/employees/目录,原访问者从收藏夹或许其余什么地点点击链接发出国访问问/people/目录下的公文的呼吁时,你势必希望她还是能够通过原有地址看到和原先同样的页面,但骨子里来看的却是网站重写针对性的新目录下的相应文件。
在老版本ASP中,使用网站重写技能的门径没多少,要么写三个ISAPI过滤器,要么购买第三方厂家提供的网站重写组件,然则在微软提供的ASP.NET下你能够通过多样措施很简单地开拓出团结的网址重写软件,以满意自个儿各个差别的内需。本文将和您一块切磋那门针对ASP.NET开荒职员的完毕网站重写的技能,然后举一些网站重写实际利用的例证。在大家深切切磋网站重写本领的内部原因以前,大家先看一下常见使用网站重写技术达成的气象。

1.3. 网站重写的貌似用途
创办贰个数量操作的ASP.NET程序最遍布的正是一个aspx页前边边带上一些询问参数集结。举例在设计贰个电子商务网址的时候,假定你设计了一项效能允许用户浏览待售的货品,为了越发方便人民群众操作,你设计了八个页面displayCategory.aspx将货品依据给定的分类彰显,那么该分类下的商品彰显页面上应有在页面文件对应网站后边加上了一个物品归类的询问参数,比如用户要询问待售的“装饰品”,在数据库中具备的饰物数据对应的归类编号CategoryID的值为5,那么用户会访问如下网站:
创造二个富含类似那样网站的网址最后有三种结果,首先从最后用户的角度来考查,
这些网站有个别零乱,可行性剖析专家Jakob Neilson(主页:
提出选拔网站展现情势时候思考如下须要(参照他事他说加以考察网站:
     ● 是或不是简短
     ● 是或不是易于输入
     ● 是还是不是将站点布局形象化
     ●
是不是具备隐蔽性,也正是让用户通过二个虚拟的切近有意义的领航地址访问指向该地方
自己想还应该在上述列表中再扩张一条:是不是方便记念。
这么些地方未有贰个地方符合Neilson标准的其余一条,也不便于记念。当然,对于有经验的互联网支付专家的话,他们很熟知这种键值对构成的询问参数结构连串,但是对于普通用户来说输入这个富含参数的网站实在是太难为了。
一种较好的主意正是运用一种比较直观且轻巧回忆的秘籍来将网站表示为:
乍一看很轻便就能够臆度这一个网站所对应的剧情极有希望会是显得装饰品(Widgets)音信,那几个网站就变得愈加便于记念和传唱!然后自个儿告诉自身的同事:“请查看这些网站:
”不用本身说第2回,她也许一次就把地址敲到浏览器上了(你也足以在亚马逊(亚马逊.com)的网址上那样尝试一下)。比非常的慢就浏览器上就列出了饰品(Widgets)的内容。这里“隐蔽性”表示:用户能够自行转移网址的尾声,例如输入:
就能够看出整个分类有关的货物列表恐怕列出全数相关商品分类目录列表。
注:用上述轻巧的变动网站内容的法子来研讨一下现行反革命的可比流行的Blog网址生成的网站。举例:要询问二〇〇四年11月二十四日所发的帖子,只需输入
  就可以,若是将网站减弱为
则展现 贰零零壹年二月份的帖子
,一样将月份回退掉获得
则展现出贰零零零年全年所发的帖子。
网站重写才具除了用于将复杂的网站轻易化之外,它还是能用来拍卖因网站目录调解依然其余原因变成发生大量的无效链接和过期书签。
1.4. 当三个Web央求传送到IIS会爆发哪些?
在搜求怎么样兑现网址重写那项技能之前,很有供给通晓一下IIS是管理所接受的Web乞请的体制。当多个Web伏乞达到IIS
Web服务器时,IIS会依照所诉求的文书后缀名来调整哪些管理该乞求,IIS能够拍卖诸如HTML页面、图片、静态内容,或许将呼吁转载给ISAPI应用程序,由该ISAPI应用程序管理后生成HTML静态内容重回给IIS,最终由IIS将呼吁结果发送回给客户端。(一个ISAPI应用程序就是一套编写翻译好能随时在后台运维的类库,它的任务正是基于央求生成相关的内容。)
比方:尽管IIS接收到多个对Info.asp的诉求,它会将该诉求转交给asp.dll来管理,该ISAPI应用程序调出并实施所央浼的ASP页面,然后把变化的HTML代码再次回到给IIS,IIS最终把内容发送回需要客户端。对于ASP.NET页面,IIS则将哀告转交给名称为aspnet_isapi.dll的ISAPI应用程序来管理,该ISAPI应用程序调用托管的ASP.NET工作经过来拍卖该诉求,并将转换的HTML代码重回给伏乞客户端。
你能够自定义IIS,将某一类扩大名映射到钦赐的ISAPI应用程序,图一显得了IIS管理工科具中的应用程序配置对话框。

澳门凯旋门游戏网址 1
**图一.已安插的公文增添名映射

**

关于对IIS怎么样管理所接收的呼吁的事无巨细研究有个别出乎本文内容,想领会的更详实的话能够参见Michele
Leroux Bustamante的小说Inside IIS and
ASP.NET
(深深钻探IIS与ASP.NET),主要的是要打听ASP.NET引擎只担负管理对扩张名曾经被正确配置映射到aspnet_isapi.dll的互联网央求。

1.5. 用ISAPI过滤器来解析恳求
除了那个之外将伏乞的文本扩充名映射到相应的ISAPI应用程序外,IIS还施行一些任何干活。举例IIS还主动对发出恳求的客户端用户举办授权,并认清已授权用户是或不是对其需要的文本具备访问权限,在三个乞求进程的整套生命期内,IIS的管理经历了多少个阶段,在每七个阶段IIS都生成二个事变,而该事件可以被ISAPI过滤器实时操控的。
就如ISAPI应用程序一样,ISAPI过滤器也是一块块装置在Web服务器上的非托管代码。ISAPI应用程序用于对所吸收接纳的一定文件类型做出响应,而ISAPI过滤器蕴藏对IIS生成的事件做出响应的代码(contain
Code),以至足以编写进出的多少。ISAPI也暗含众多应用程序,包涵:
    · 权限调控与授权(Authentication and Authorization)
    · 日志记录与监视(Logging and Monitoring)
    · HTTP内容收缩(HTTP Compression)
    · 网址重写(ULacrosseL Rewriting)
本文所斟酌的用ASP.NET达成的网站重写技巧正是依照ISAPI过滤器用于网站重写的技巧内容,可是我们还是要切磋一下究竟是应用ISAPI过滤器还是接纳ASP.NET应用程序提供的技术来促成网站重写能力。

1.6. 当一个央求传入ASP.NET引擎的时候会生出什么样?
ASP.NET问世以前,在IIS
Web服务器上的网站重写作用须求经过ISAPI过滤器来促成,自从这个人问世后大家就能够透过ASP.NET来完毕U大切诺基L重写了,因为ASP.NET的演说引擎与IIS有特大的相似之处,产生这一个相似性首假设因为ASP.NET:
    · 在拍卖接收的伏乞的生命期内也会发出事件;
    ·
允许私自数量的HttpModule操控产生的风云,那与IIS中的ISAPI过滤器好像;
    ·
将央浼的资开始和结果托给HttpHandler拍卖,那与IIS中的ISAPI应用程序附近。
和IIS同样,在一个呼吁的百分百生命期内,ASP.NET对该央求的管理状态产生的意况更换时限信号引发相应的事件。举个例子:BeginRequest事件在ASP.NET起先响应客户端要求之始引发;AuthenticateRequest事件在ASP.NET确立用户身份后掀起,当然还应该有诸如AuthorizeRequestResolveRequestCacheEndRequest等其余众多风云,那一个都以System.Web.HttpApplication类下的事件,更加的多新闻请参照他事他说加以考察技能文书档案中的类HttpApplication概要(HttpApplication
Class
Overview
)。
总的看,能够创设ISAPI过滤器并用于相应IIS引发的轩然大波,同理,ASP.NET也提供了HttpModule用以响应ASP.NET引擎引发的事件,一个ASP.NET应用程序通过安插能够有所三个HttpModule。ASP.NET引擎每管理两个呼吁,便开首化贰个应和安插好的HttpModule,并同意它针对央求管理时期吸引的事件生成对应的事件委托。事实上ASP.NET引擎管理每三个呼吁调用大量的风浪委托。FormsAuthenticationModule正是成都百货上千内嵌HttpModule中的二个,它首先检查是还是不是利用表单授权,固然是的话,它将检查用户是不是已授权,若无授权则自动把用户重定向到钦定的记名页面。
遥想在IIS中,一项央求最终被转送给一个ISAPI应用程序管理,该应用程序针对每一种央求进行管理并回到相应的数据。比如,客户端发出几个拜访杰出ASP页面包车型地铁乞请,IIS将该伏乞转交给asp.dll程序管理,asp.dll针对该央求实行asp页面内容,并重临HTML编码。ASP.NET也选拔了就像的一手,ASP.NET引擎在将这个HttpModule开头化后,决断并操纵调用相应的HttpModule来拍卖该必要。
具备通过ASP.NET引擎深入分析的呼吁最后被交付二个HttpHandler或者HttpHandlerFactory(一个HttpHandler只是简短地回来叁个用来拍卖该央求的HttpHandler的实例。)最后的寄托呈现并响应所诉求的HTML编码,并发送回IIS,IIS则将HTML重临给央求客户端。
ASP.NET包蕴众多HttpHandler,例如,PageHandlerFactory是用来呈现ASP.NET页面内容,WebServiceHandlerFactory凯旋门074网址,用于展现ASP.NET
Web服务的SOAP数据包,TraceHandler用于将ASP.NET伏乞能源的HTML标志写入trace.axd。
图二描绘了一个对准ASP.NET能源的央求所经过的管理流程。首先,IIS接收到该须要并将其传递给aspnet_isapi.dll。其次,ASP.NET引擎将一些HttpModule初始化。最后,最终的HttpHandler被调用,生成对应的号子语言,并将其回到给IIS,最终回到到央求客户端。

澳门凯旋门游戏网址 2
图二.IIS和ASP.NET对乞求的管理进度

1.7. 创建并登记自定义HttpModule和HttpHandler
创造自定义HttpModule的干活相对较轻松,它总结贰个贯彻当前接口的托管类,HttpModule务必贯彻System.Web.IHttpModule接口,同样HttpHandlerHttpHandlerFactory非得各自已毕System.Web.IHttpHandler接口和System.Web.IhttpHandlerFactory接口。有关创造HttpHandlerHttpModule的细节已经超(Jing Chao)越本书范围,要领会越来越多详细情况请参阅Mansoor
Ahmed Siddiqui的文章《HttpHandlers and HTTP modules in
ASP.NET
》(ASP.NET中的HttpHandler和HttpModule)。
一旦HttpModuleHttpHandler被创立后,必须向Web应用程序注册。若是要向一切Web服务器HttpModuleHttpHandler只需轻松的写入machine.config文件;假设是由钦赐的Web应用程序调用则需在该程序的web.config配置文件中增添几行XML标识。
诸如,要向钦点的Web应用程序注册HttpModuleHttpHandler,只需向该Web应程序的web.config配置文件中configuration\System.Web节中加多下列几行:

澳门凯旋门游戏网址 3<HttpModules>
澳门凯旋门游戏网址 4    <add type=”type” name=”name” />
澳门凯旋门游戏网址 5</HttpModules>

其中type属性为澳门凯旋门注册网址,HttpModule的标志号和类库名称,name天性则为该模块取五个较为和谐的名目方便在Global.asax调用。
HttpHandlerHttpHandlerFactory则是在web.config文件中configuration\System.Web节中增添<httpHandler>标识,比方:

澳门凯旋门游戏网址 6<httpHandlers>
澳门凯旋门游戏网址 7    <add verb=”verb” path=”path” type=”type” />
澳门凯旋门游戏网址 8</HttpModules>

回看上文,ASP.NET对每叁个收到到的呼吁指派相应的HttpHandler来管理并展现相应内容,该指派决定于所吸收接纳乞请的verb和path的内容,verb为HTTP央浼的品种:GET也许POST,path则为呼吁的文书的路线和文件名。若是大家筹算用三个HttpHandler来拍卖全体GET类型和POST类型的还要文件扩大名叫.scott的剧情,能够在web.config相应配置节中参预下列标识:

澳门凯旋门游戏网址 9<httpHandlers>
澳门凯旋门游戏网址 10    <add varb=”*” path=”.scott” type=”type” />
澳门凯旋门游戏网址 11</httpHandlers>

个中type是我们定义的澳门凯旋门游戏网址,HttpHandler的类型。
注意:在注册HttpHandler的时候必须小心HttpHandler所运用的文书扩充名必须已经在IIS中做指向ASP.NET引擎的照射,在上面.scott扩充名的例子中,若是大家所使用的.scott扩充名若无在IIS中做指向ASP.NET引擎的映照的话,假定对foo.scott文件发出须求,该必要将促成IIS将foo.scott文件内容一向展现给客户端,为了能够让HttpHandler管理该央浼,必须将.scott扩展名在IIS中做指向ASP.NET引擎的炫彩,之后IIS才干科学地将.scott的乞请转交给相应的HttpHandler
有关HttpModuleHttpHandler更详细的内容请参阅MSDN中<HttpModules>节和<httpHandlers>节的文书档案音讯。
<HttpModules>文书档案参照他事他说加以考查;
<httpHandlers>文书档案参考。

1.8. 兑现网站重写
网站重写技能不只能够在IIS
Web服务器一级通过ISAPI过滤器完结,而且还足以在ASP.NET一级通过HttpModule或者HttpHandler完毕。本文首要关怀在ASP.NET超级完结网站重写技巧,所以此时不用关怀在ISAPI应用程序中达成网站重写的本领细节,而且有大多第三方厂家提供的ISAPI过滤器,比方
    Helicon的ISAPI Rewrite
    QwerkSoft的IIS
Rewrite
;Port80的PageXChanger
    等等。

1.9. 营造网站重写引擎
在ASP.NET中贯彻网站重写很简短,只需调用System.Web.HttpContext类的RewritePath()方法就能够。HttpContext类中涵盖有关于特定HTTP央浼的HTTP规范新闻。ASP.NET引擎每接收到叁个一定供给后便针对该央求创立七个特定的实例,这些类富含部分品质诸如:RequestResponse属性,分别提供对乞求和响应的拜访;ApplicationSession天性提供对Application变量和Session变量的访问;User属性提供对已授权用户音信的造访。
在微软.NET Framework
1.0版本中,RewritePath()办法接收多个新路径的粗略字符串,在其内部HttpContext类的RewritePath(string)艺术内在地立异Request对象的门径和询问参数。除了RewritePath(string)主意之外,.NET
Framework
1.1版还提供了此外一些重载版本,个中贰个重载版本接收四个输入字符串参数,这种交替的重载方式不止只是设置Request对象的门路和查询参数那个属性,而是设置越来越深层的分子变量,那个分子变量用于为PhysicalPathPathInfoFilePath特性计算Request对象值。
为了落到实处ASP.NET中的网站重写,大家供给创制一个HttpHandlerHttpModule用于:
 依据央求的路线决定所必要重写的门径;
 重写路线,假若须要的话可以调用RewritePath方法;
之前文所创设的丰硕站点为例,能够因此/info/employee.aspx?empID=EmployeeID来访问每一个雇员的新闻。为了使这几个网站尤其地有所“隐蔽性”,我们兴许会选用进一步轻巧精通的访问格局如:/people/雇员名.aspx。这里就有了二个网站重写的案例:当接受到对/people/斯科特Mitchell.aspx的央浼的时候,我们就得利用网站重写使得对该页面包车型地铁呼吁被重写指向到从前采取的/info/employee?EmpID=1001地址。

1.10. 选用HttpModule来调用网站重写
在ASP.NET一级来施行网站重写,不仅能够选取HttpHandler,也得以行使HttpModule。当使用HttpModule的时候,必须调控假诺该网站须要被重写的话,毕竟应该在任何央浼的生命周期期间的那多少个点来接纳。乍一瞅着有些武断,不过这一个决定以第一而且微妙的措施影响到您的应用程序。之所以作出对网站重写点的选用是因为内嵌的ASP.NET
HttpModule使用Request对象的属性值来变成本人的办事(纪念一下重写路线对Request指标的属性值的改观),那一个内嵌HttpModule和对应事件的紧密关体系举如下:

HttpModule 事件 简介
FormsAuthenticationModule AuthenticateRequest 判断用户是否已通过表单授权方式获取授权,如果没有的话则将用户重定向到指定的登录页面
FileAuthorizationModule AuthorizeRequest 当使用Windows授权方式的时候,该HttpModule判断并确定该Microsoft Windows帐户是否对其请求的资源拥有足够的权限
UrlAuthorizationModule AuthorizeRequest 检查并确认请求者是否对所访问的网址拥有权限。该Url授权可以在web.config文件的<authorization>和<location>元素中配置

遥想一下BeginRequest事件在AuthenticateRequest事件此前引发,而AuthenticateRequest事件又在AuthorizeRequest事件在此之前引发。
落实网站重写的一个相比安全的场子便是把它放在在BeginRequest事件中实践,那象征假如要施行网站重写的话,在无数内嵌HttpModule运营的时候他现已完结了。这种路线的末段用途痛快淋漓地反映在表单验证上。当用户访问受限能源的时候,如若在此之前运用了表单验证,他会自动被重定向到内定的记名页面,在功成名就登入之后,用户被重定向回先前计划访问的受限制页面。
万一把网站重写放在BeginRequest事件仍旧AuthenticateRequest事件中,在签到页面上实施提交后,该页面会将用户重定向到网站重写钦命的页面。假定当用户在浏览器上敲入/people/ScottMitchell.aspx地址,该地方是要被重定向到/info/employee.aspx?EmpID=1001的,倘若该Web应用程序设定使用表单验证,当用户开首访问/people/ScottMitchell.aspx的时候,该网站将重写指向/info/employee.aspx?EmpID=1001,接着ForumAuthenticationModule开行,假使必要的话将用户重定向到登陆页面,用户登陆后重定向到的页面将是/info/employee.aspx?EmpID=1001,那也是自从FormAuthenticationModule开发银行运维时所发出央浼的页面。
同上看似,当把网站重写放在BeginRequest事件恐怕AuthenticateRequest事件中运行的时候,UrlAuthenticationModule也开掘了网站重写针对性的网站,那代表一旦在该应用程序的web.config文件中<location>节为特定的网站配置特定的授权地址的话,你得援引重写所指向的网站。
为了缓慢解决这些神秘的主题材料,多个可能即是把网站重写放在AuthorizeRequest事件中运作,但是在使用这种方法解决U卡宴L授权和表单授权的不胜时又引进了二个新的老毛病:文件授权会失效。当使用Windows验证的时候,FileAuthorizationModule反省并表达已经过验证的用户是或不是富有丰富的权能访问特定的ASP.NET页面。
万一有一堆用户并未Windows级别的访问权限访问C:\1.0.请一定要抱着批评的态度来看该文章。inetpub\wwwroot\info\employee.aspx,当那个用户筹算访问/info/employee.aspx?EmpID=1001的时候,他们会拿走未授权的荒谬,如若大家把网址重写放到AuthenticateRequest事件中运作,当FileAuthorizationModule表明该安全性设置的时候,他仍任人为被呼吁的公文是/people/Scott米切尔.aspx,而此刻该网址已经被重写了,因而FileAuthorizationModule会一贯放行,让用户看到了网站重写针对性的内容:/info/employee.aspx?Empid=1001。
那么哪些时候在HttpModule调用网站重写合适吗?他决定于所采纳的验证措施,当然假若不应用表达措施的话,那么不论在BeginRequest事件、AuthenticateRequest事件恐怕AuthorizeRequest事件中调用网站重写未有多大分别,若是利用表单验证格局并且不利用Windows验证情势的话,把网站重写放入AuthorizeRequest事件委托中调用既可,要是使用Windows验证情势的话,把那项效能放入BeginRequest事件依然AuthenticateRequest事件调用就行了。

1.11. 采取HttpHandler来调用网站重写
除此之外上边所述方法外,网站重写也得以放入HttpHandler1.0.请一定要抱着批评的态度来看该文章。或者HttpHandlerFactory中调用。HttpHandler是四个顶住针对特定诉求生成对应内容的类,而HttpHandlerFactory归来一个HTTP的实例,该实例针对特定请求生成对应内容。
本节将观测于为这几个ASP.NET页面创立二个网站重写的HttpHandlerFactory。创建HttpHandlerFactory总得兑现IHTTPHandlerFactory接口,它蕴含多个GetHandler()办法。ASP.NET引擎在起始化那一个HttpModule后做出决定针对该央浼调用相应的HttpHandler或者HttpHandlerFactory,在调用HttpHandlerFactory的时候,针对该Web诉求以及随同的其它音讯的HttpContext中经过的的HttpHandlerFactoryGetHandler()格局将被ASP.NET引擎调用,HttpHandlerFactory无法不重临叁个能源委员会托该须要的对象,并且该目的要能完毕IHttpHandler接口。
要因此多少个HttpHandler来调用网站重写,能够先创建贰个HttpHandlerFactory,它的GetHandler()艺术检查所央浼的网址并操纵是否供给调用网站重写。假设要调用网站重写的话则调用前文所述的已由此检查的HttpContext对象的RewritePath()方法。最后该HttpHandlerFactory回来一个由类System.Web.UI.PageParserGetCompiledInstance()格局再次回到的HttpHandler。(这与内嵌于ASP.NET页面包车型客车HttpHandlerFactoryPageHandlerFactory)的办事原理一样。)
在所有HttpModule被起先化后,HttpHandlerFactory就从头被实例化。把网站重写放在这几个事件场地的终极贰个中间调用的时候,也会超越同样的题目:文件授权将会失效。倘诺非要正视于Windows验证和文书表明的时候,你恐怕得利用HttpModule来调用网站重写了。
下一章大家入眼于怎样创设贰个可选拔的网址重写引擎,使用下文所提的这么些示例均以实际案例作为参照,在笔者主页上提供下载。先用用多少个简易的网站重写的例子来探究怎样达成网站重写,紧接着将采用网站重写引擎中正则表明式的强有力管理技术来体现实在“隐蔽”的网站重写技能!

1.12. 利用网站重写引擎达成不难的网站重写
为了方便在Web应用程序中贯彻网站重写,作者创设了贰个网站重写引擎,该引擎提供下列功用:
 可以在web.config文件中为页面开采者定义其所利用的网站重写引擎的平整;
 通过利用正则表达式来使所制订的网站重写准绳有所越来越强硬的重写技能;
 能够透过轻巧安排就可以在HttpModuleHttpHandler中使用网站重写。
本节只探究通过HttpModule来促成网址重写,要询问什么通过HttpHandler来贯彻网站重写请下载本文提供的代码。

1.12.1. 安装网站重写引擎的配备音信
大家来钻探一下在web.config中网站重写准绳的配置节。首先必须在web.config文件中提议是还是不是要求在HttpHandler或者HttpModule中调用网站重写,在web.config中,下文已经包括了多少个曾经被解说掉的配置节:

澳门凯旋门游戏网址 12<!–
澳门凯旋门游戏网址 13<HttpModules>
澳门凯旋门游戏网址 14    <add type=”URLRewriter.ModuleRewriter,URLRewriter” name=”ModuleRewriter”/>
澳门凯旋门游戏网址 15</HttpModules>
澳门凯旋门游戏网址 16–>
澳门凯旋门游戏网址 17
澳门凯旋门游戏网址 18<!–
澳门凯旋门游戏网址 19<httpHandlers>
澳门凯旋门游戏网址 20 <add verb=”*” path=”*.aspx” type=”URLRewriter.RewriterFactoryHandler,URLRewriter” />
澳门凯旋门游戏网址 21</httpHandlers>
澳门凯旋门游戏网址 22–>
澳门凯旋门游戏网址 23

被批注掉的<HttpModules>为布局利用HttpModule调用网站重写;注释掉的<httpHandler>为布局使用HttpHandler调用网站重写。
不论是配置使用<HttpModules>依然<httpHandlers>调用网址重写,除此而外还须配备网站重写法规,一条重写准则包罗两项字符串:乞请UCRUISERL中的查找格局和指向该形式的相称成功后的轮换字符串。该音讯在web.config文件中用下列标签描述:

澳门凯旋门游戏网址 24<RewriterConfig>
澳门凯旋门游戏网址 25    <Rules>
澳门凯旋门游戏网址 26        <RewriterRule>
澳门凯旋门游戏网址 27            <LookFor>pattern to look for</LookFor>
澳门凯旋门游戏网址 28            <SendTo>String to replace pattern with </SendTo>
澳门凯旋门游戏网址 29        </RewriterRule>
澳门凯旋门游戏网址 30        <RewriterRule>
澳门凯旋门游戏网址 31            <LookFor>pattern to look for</LookFor>
澳门凯旋门游戏网址 32            <SendTo>String to replace pattern with </SendTo>
澳门凯旋门游戏网址 33        </RewriterRule>
澳门凯旋门游戏网址 34        澳门凯旋门游戏网址 35
澳门凯旋门游戏网址 36    </Rules>
澳门凯旋门游戏网址 37</RewriterConfig>
澳门凯旋门游戏网址 38

每一条法规都用三个<RewriterRule>成分表示,以<LookFor>节表示查询方式,当查问形式发掘相称字符串时便用<SendTo>节表示的字符串举办替换。这个准则从上到下举行询问相称,假若找到四个相称则按此法则实施网站重写,并且停止查找。
布局<LookFor>节要使用正则表明式来进行字符串相称和替换。(在此大家举三个例证来证实如何运用正则表达式来对字符串举行相配和替换。)既然该查找情势是三个正则表明式,那么要专注避让对正则表明式保留字符串的直接使用。(正则表明式的保存字符串包蕴有:.,?,^,$,等等,能够经过在前头加上二个反斜线来引用这一个保留字符,举例\.表示援用多少个句点)

1.12.2. 用到HttpModule来试行网站重写

创办一个HttpModule很轻巧,只要创立三个兑现IHttpModule接口的类,该IHttpModule接口定义了五个艺术:
 Init(HttpApplication),该措施在HttpModule发轫化时引发,通过该方法为HttpApplication事件调用相应的风云委托;
 Dispose()1.0.请一定要抱着批评的态度来看该文章。,当相应央浼管理终结并发送回IIS调用此措施,通过此措施推行最终具有的清理和回收程序。
为了越发有利地为网站重写成立HttpModule,从一初始自身就创制一个华而不实的基类(BaseModuleRewriter),该类完结了IHttpModule接口。在Init(HttpApplication)事件中,它通过BaseModuleRewriter_AuthorizeRequest办法引发了HttpApplicationAuthorizeRequest事件,该BaseModuleRewriter_AuthorizeRequest措施通过此类的Rewrite()方法重写传入参数HttpApplication对象的里边乞请虚拟路线(Path)。在BaseModuleRewriter对象中,该Rewrite()措施是空虚的,并且未有实际内容,但在雄起雌伏自该类的靶子中务必重载Rewrite()办法并为该办法提供实际内容。
通过对该基类的接轨,全部须要做的干活正是创办多少个一连自BaseModuleRewriter的类,重载Rewrite()办法并在该方法中增多网站重写逻辑代码。下文列出BaseModuleRewriter代码:

澳门凯旋门游戏网址 39public abstract class BaseModuleRewriter : IHttpModule
澳门凯旋门游戏网址 40澳门凯旋门游戏网址 41澳门凯旋门游戏网址 42{
澳门凯旋门游戏网址 43澳门凯旋门游戏网址 44    public virtual void Init(HttpApplication app)澳门凯旋门游戏网址 45{
澳门凯旋门游戏网址 46        // WARNING!  This does not work with Windows authentication!
澳门凯旋门游戏网址 47        // If you are using Windows authentication, 
澳门凯旋门游戏网址 48        // change to app.BeginRequest
澳门凯旋门游戏网址 49        app.AuthorizeRequest += new EventHandler(this.BaseModuleRewriter_AuthorizeRequest);
澳门凯旋门游戏网址 50    }
澳门凯旋门游戏网址 51
澳门凯旋门游戏网址 52澳门凯旋门游戏网址 53    public virtual void Dispose() 澳门凯旋门游戏网址 54{}
澳门凯旋门游戏网址 55
澳门凯旋门游戏网址 56澳门凯旋门游戏网址 57    protected virtual void BaseModuleRewriter_AuthorizeRequest(object sender, EventArgs e)澳门凯旋门游戏网址 58{
澳门凯旋门游戏网址 59        HttpApplication app = (HttpApplication) sender;
澳门凯旋门游戏网址 60        Rewrite(app.Request.Path, app);
澳门凯旋门游戏网址 61    }
澳门凯旋门游戏网址 62
澳门凯旋门游戏网址 63    protected abstract void Rewrite(string requestedPath, HttpApplication app);
澳门凯旋门游戏网址 64}

注意:该BaseModuleRewriter类将网址重写放在AuthorizeRequest事件中调用,假设要接纳Windows验证并利用文件评释形式时请修改代码将网站授权放在BeginRequest或者AuthenticateRequest事件中。
ModuleRewriter继承自BaseModuleRewriter,并确实意义地落到实处了网站重写的操作,该类仅蕴含三个重载了的主意Rewrite(),其剧情如下文所示:

澳门凯旋门游戏网址 65protected override void Rewrite(string requestedPath, System.Web.HttpApplication app)
澳门凯旋门游戏网址 66澳门凯旋门游戏网址 67澳门凯旋门游戏网址 68{
澳门凯旋门游戏网址 69    // get the configuration rules
澳门凯旋门游戏网址 70    RewriterRuleCollection rules = RewriterConfiguration.GetConfig().Rules;
澳门凯旋门游戏网址 71    // iterate through each rule澳门凯旋门游戏网址 72
澳门凯旋门游戏网址 73    for(int i = 0; i < rules.Count; i++)
澳门凯旋门游戏网址 74澳门凯旋门游戏网址 75    澳门凯旋门游戏网址 76{
澳门凯旋门游戏网址 77        // get the pattern to look for, and 
澳门凯旋门游戏网址 78        // Resolve the Url (convert ~ into the appropriate directory)
澳门凯旋门游戏网址 79        string lookFor = “^” + 
澳门凯旋门游戏网址 80        RewriterUtils.ResolveUrl(app.Context.Request.ApplicationPath, rules[i].LookFor) + “$”;
澳门凯旋门游戏网址 81        // Create a regex (note that IgnoreCase is set澳门凯旋门游戏网址 82)
澳门凯旋门游戏网址 83        Regex re = new Regex(lookFor, RegexOptions.IgnoreCase);
澳门凯旋门游戏网址 84        // See if a match is found
澳门凯旋门游戏网址 85        if (re.IsMatch(requestedPath))
澳门凯旋门游戏网址 86澳门凯旋门游戏网址 87        澳门凯旋门游戏网址 88{
澳门凯旋门游戏网址 89            // match found – do any replacement needed
澳门凯旋门游戏网址 90            string sendToUrl = RewriterUtils.ResolveUrl(app.Context.Request.ApplicationPath, re.Replace(requestedPath, rules[i].SendTo));
澳门凯旋门游戏网址 91            // Rewrite the URL
澳门凯旋门游戏网址 92            RewriterUtils.RewriteUrl(app.Context, sendToUrl);
澳门凯旋门游戏网址 93            break;      // exit the for loop
澳门凯旋门游戏网址 94        }
澳门凯旋门游戏网址 95    }
澳门凯旋门游戏网址 96}
澳门凯旋门游戏网址 97

Rewriter()办法以博得web.config文件中的网站重写法规的设置为早先,它通过轮回访问各条网站重写准则,每便均取妥帖前法规中的LookFor个性,用正则表达式验证并认清是还是不是查找是不是对眼下呼吁的网站是或不是有合作。
假如开采一条相配,将用当下法则的SendTo值对需要的门路实践七个正则表明式替换,替换后的地址通过参数的情势传给RewriterUtils.RewriteUrl()方法,RewriterUtils是三个救助类,它提供部分HttpModuleHttpHandler都能够选拔的静态方法,RewriterUrl()主意只是总结地调用了HttpContext对象的RewritePath()方法。
小心:你早已注意到了当实行正则表明式相配和替换的时候调用了二个RewriterUtils.ResolveUrl()措施。该接济方法简单易行地更迭了应用程序路线中“~”的具有实例。
正文附录中提供全体关乎该网站重写引擎的代码下载,大家早已探寻了十分重要的一些,可是还会有别的一些零件诸如将web.config文件中XML格式化了的网站重写准绳反连串化至二个对象的类定义、通过HttpHandlerFactory落实网站重写的类定义等。本文最终三节将透过一些安分守己案例来商讨网站重写的才具。

1.12.3. 用网站重写引擎完结简单的网站重写
为了更加好地示范网站重写引擎的运营,我们来树立三个ASP.NET
Web应用程序来促成轻便的网站重写引擎。假定大家为一家在线出卖各样货品的小卖部服务,这个制品分割为以下项目:
分类编号(CategoryID) 分类名称(CategoryName)
1 饮料(Beverages)
2 调味品(Condiments)
3 工艺品(Confections)
4 日记本(Diary Products)
… …
假设已经制造好三个名叫ListProductsByCategoryID.aspx的ASP.NET页面文件,它经过询问参数获取三个分类编号,并依照此号码获取具备该分类下的持有商品。借使用户想浏览所出售的果汁类商品能够经过ListProductsByCategoryID.aspx?CategoryID=1来拜访,假若用户想浏览所出卖的日志本类商品能够因而ListProductsByCategoryID.aspx?CategoryID=4来走访。假定还应该有二个页面ListCategories.aspx,它列出全体代售商品的归类编号。
明明这里开采了四个网站重写的案例。对于用户来讲他们所输入的地点不持有任何实际意义并且不持有任何“隐蔽性”,倒不及使用网站重写引擎让用户去做客/Products/Baverage.aspx地址,系统将该地点重写到ListProductsByCategoryID.aspx?CategoryID=1。大家能够在web.config文件中来成功网站重写任务:

澳门凯旋门游戏网址 98<RewriterConfig>
澳门凯旋门游戏网址 99    <Rules>
澳门凯旋门游戏网址 100        <!—- Rules for products lister –>
澳门凯旋门游戏网址 101        <RewriterRule>
澳门凯旋门游戏网址 102            <LookFor>~/Products/Baverage.aspx</LookFor>
澳门凯旋门游戏网址 103            <SendTo

澳门凯旋门游戏网址 104<RewriterConfig>
澳门凯旋门游戏网址 105    <Rules>
澳门凯旋门游戏网址 106        <!—- Rules for products lister –>
澳门凯旋门游戏网址 107        <RewriterRule>
澳门凯旋门游戏网址 108            <LookFor>~/Products/Baverage.aspx</LookFor>
澳门凯旋门游戏网址 109            <SendTo>~/ListProductsByCategoryID.aspx?CategoryID=1</SendTo>
澳门凯旋门游戏网址 110        </RewriterRule>
澳门凯旋门游戏网址 111    </Rules>
澳门凯旋门游戏网址 112</RewriterConfig>

很显著地观望,寻找用户访问的门路是或不是相称/Products/Baverage.aspx,要是同盟的话,则将网站重写到/ListProductsByCategoryID.aspx?CategoryID=1。
瞩目:你会发掘<LookFor>节点中防止直接在“Baverage.aspx”中动用句点“.”是因为<LookFor>节点的值是正则表明式的合作形式,在正则表达式中句点符号是三个特殊字符,它象征非常任何二个字符,也正是说假设访问BaverageQaspx时也会时有发生相配,为了防止生出那几个句点引起的合营我们得在该句点符号前边加上三个“\”,表示引用句点符号
通过该准绳定义,当用户访问/Products/Baverage.aspx文件的时候,他们将看到代售的果汁类商品列表信息。图3为访问/Products/Baverage.aspx地址时的浏览器截图,注意在浏览器中地址栏上显得的是用户输入的/Products/Baverage.aspx地址,不过实际上访问的地点却是网址重写后的/ListProductsByCategoryID.aspx?CategoryID=1。(事实上,在服务器上根本就不存在/Products/Baverage.aspx文件!)

澳门凯旋门游戏网址 113
图三.网址重写后的对货色归类的央求
和/Products/Baverage.aspx类似,下一步我们抬高其它分类的重写准则,只需轻便地在web.config文件中<Rules>中在增进其余<RewriteRule>节就可以。该演示完整的重写准绳集合请参谋下载文档的web.config文件中的定义。
为了让该网站更享有“隐蔽性”,若是让用户把/Products/Baverage.aspx前边Baverage.aspx一段截去,在浏览器中输入/Products/来浏览产品分类列表会越来越好一些。乍一看,那项任务卑不足道,只需增加一条网站重写法则将/Products/映射到/ListCategories.aspx就可以。可是这里有三个微妙之处,你必须先创立一个/Products/目录,并在其间放一个空文件Default.aspx。
要认知为啥那个额外的步调是必须的,先想起一下前文。网站重写引擎是居于ASP.NET一流的,也正是说,假使ASP.NET未有收获管理央求的时机的话,网站重写引擎就不能够对输入的网站央求作出判定。其它,IIS仅在央求文件包罗相应扩充名时才将呼吁转交给ASP.NET引擎。假如用户访问/Products/,IIS并不知道其扩张名是何等,于是它检查该目录下的文书看是还是不是带有有暗许首页文件名(Default.aspx,Default.htm,Default.asp,等等,这么些文件名在IIS管理工科具对话框中Web服务器质量对话框中的文书档案标签中定义。)当然,假若/Products/目录不设有的话,IIS将赶回三个HTTP
404荒唐。
为此大家须要创立八个/Products/目录并在该目录下额外创制三个空文件Default.aspx,IIS会检查该目录下的公文,开掘有贰个默许文件名Default.aspx,于是将央求转交给ASP.NET,那样,网站重写引擎技术奏效。

澳门凯旋门游戏网址 114<RewriterRule>
澳门凯旋门游戏网址 115    <LookFor>~/Products/Default.aspx</LookFor>
澳门凯旋门游戏网址 116    <SendTo>~ListCategories.aspx</SendTo>
澳门凯旋门游戏网址 117</RewriterRule>

经过该法规,用户访问/Products/Default.aspx恐怕访问/Products/都能够见见如图四所示的制品分类列表。
澳门凯旋门游戏网址 118
图四.在网站上助长“隐蔽性”

1.12.4.处理回送数据
倘使要重写的网站上含蓄有服务器端Web Form并实践多少回送,当该Web
Form回送数据时会暴露出真实的网站,也正是说,当用户访问/Products/Baverage.aspx时,浏览器上地址栏突显的也是/Products/Baverage.aspx,不过实际上是造访/ListProdutsByCategoryID.aspx?CategoryID=1的源委,假使ListProductsByCategoryID.aspx页面实施了数码回送的话,用户被数据回送定向给原本的/ListProductByCategoryID.aspx?CategoryID=1页面上,而不是/Products/Baverage.aspx页面。那即使不是怎么着大主题材料,不过用户会发觉到点击二个开关时网站发生了的浮动,那恐怕会让人不安,因为假如是因为网站安全的角度来讲,直接把真正的网站暴流露来了。
故而爆发这种现象的原由是当Web
Form在表现之时就料定地设置其action属性为当前Request目的粤语件路线的值。当然,在Web
Form展现之时,从/Produts/Baverage.aspx到/ListProductsByCategoryID.aspx?CategoryID=1的网站重写就已经实施完结了,那意味Request对象所反映的是现阶段用户所走访的地址是/ListProductsByCategoryID.aspx?CategoryID=1。这么看来,只需让该服务器端表单在展现之时不显示action属性就能够缓和难点了。(对浏览器来讲,假若不设置action属性的话,那么在交付的时候将运用其私下认可值。)
只是不幸的是该Web
Form不会允许你钦命action属性,也不会容许你通过设置某性子能来落成禁止使用显示action属性的指标。得自行承袭System.Web.HtmlControls.HtmlForm以此类,天公地道载该类的RenderAttribute()艺术,明确提议该类不显示acton属性。
多谢承接那些庞大的效益,使得大家一点也不细略就拿走了HtmlForm本条类下全部的功效定义,只需一些些几行代码就达到所需目标,完整代码如下所示:

澳门凯旋门游戏网址 119namespace ActionlessForm
澳门凯旋门游戏网址 120澳门凯旋门游戏网址 121澳门凯旋门游戏网址 122{
澳门凯旋门游戏网址 123        public class Form:System.Web.UI.HtmlControls.HtmlForm
澳门凯旋门游戏网址 124澳门凯旋门游戏网址 125        澳门凯旋门游戏网址 126{
澳门凯旋门游戏网址 127                protected override void RenderAttributes(System.Web.UI.HtmlTextWriter writer)
澳门凯旋门游戏网址 128澳门凯旋门游戏网址 129                澳门凯旋门游戏网址 130{
澳门凯旋门游戏网址 131                        writer.WriteAttribute(“name”,this.Name);
澳门凯旋门游戏网址 132                        base.Attributes.Remove(“name”);
澳门凯旋门游戏网址 133
澳门凯旋门游戏网址 134                        writer.WriteAttribute(“method”,this.Method);
澳门凯旋门游戏网址 135                        base.Attributes.Remove(“method”);
澳门凯旋门游戏网址 136
澳门凯旋门游戏网址 137                        this.Attributes.Render(writer);
澳门凯旋门游戏网址 138
澳门凯旋门游戏网址 139                        base.Attributes.Remove(“action”);
澳门凯旋门游戏网址 140
澳门凯旋门游戏网址 141                        if (base.ID!=null)
澳门凯旋门游戏网址 142澳门凯旋门游戏网址 143                        澳门凯旋门游戏网址 144{
澳门凯旋门游戏网址 145                                writer.WriteAttribute(“id”,this.ClientID);
澳门凯旋门游戏网址 146                        }
澳门凯旋门游戏网址 147                }
澳门凯旋门游戏网址 148        }
澳门凯旋门游戏网址 149}
澳门凯旋门游戏网址 150

RenderAttributes()格局重载的代码包蕴了原类HtmlFormRenderAttributes()艺术漫天的代码内容,只是轻松地去掉了设置action属性这一节。(作者参谋了Lutz
Roeder的Reflecter一文中类HtmlForm的源代码)
当创建并编写翻译了这几个类后,将其增加到引用目录就能够在该ASP.NET
Web应用程序中央银行使。为了将原始HtmlForm类替换,只需轻便地在页面顶端增添下列代码:

澳门凯旋门游戏网址 151澳门凯旋门游戏网址 152<%澳门凯旋门游戏网址 153@ Register TagPrefix=”skm” Namespace=”ActionlessForm” Assembly=”ActionlessForm”%>

下一场将<Form runat=”server”>标签替换为

澳门凯旋门游戏网址 154<skm:Form id=”Form1″ method=”post” runat=”Server”>

并将终结标识</Form>替换为

澳门凯旋门游戏网址 155<skm:Form>

你能够查看该文书档案相关下载中的ListProductsByCategoryID.aspx文件中的自定义Web
Form,该下载已经提供了一体化的Visual Studio.NET项目文件包。
留意:如若您筹算张开网站重写的地点不实行多少回送,则无需运用该自定义Web
Form的类。

1.13. 创造真正“隐蔽”的网站
上一节轻便网站重写的亲自过问显示了什么通过新的网址重写准绳来轻便地布署网站重写引擎,本节将经过独立的正则表明式来展现网站重写的强劲威力。
方今正在流行Blog,很几人都抱有三个谈得来的Blog。不论你是否对Blog感觉素不相识,他们正在持续地翻新本身的Blog页面,那个页面就如二个私人民居房日记本同样。大好多Bloger只是轻巧地记下每天发生的作业,也会有一点集中于某一核心,比方影片冲突、看球的客官协会、计算机手艺等。
Blog能够在任哪里点由小编实行翻新,更新次数能够是一天频仍,也足以是一周一四次。在Blog页面上只彰显方今10条立异,但事实上全数的Blog软件都提供了存档记录,访客可以翻阅其历史记录。有了“隐蔽”的网站,Blog应用程序将变得更抓好有力。假定你通过/二零零二/02/14.aspx来询问本身的Blog上的稿子,你会为阅读到二〇〇〇年十一月17日的Blog感觉欢跃呢?其它你大概为了访问二〇〇二年十二月有着的Blog而将该地址减少为/二〇〇四/02/,要访问二零零三年抱有的Blog,你大概会试着去访问/2002/。
在保安贰个Blog的时候,要是将这种颇具“隐蔽性”的网址提须求用户将会越来越好。实际上繁多Blog引擎都提供了这种网址重写的成效,今后来看看那些是什么通过网址重写达成的。
第一,大家要求三个页面能够分别根据年、月、日分别突显Blog的剧情。假定以后一度办好了三个页面文件ShowBlogContent.aspx,它能分别获得年、月、日的询问参数,要翻开2001年三月三11日所发的帖子,大家得以访问/ShowBlogContent.aspx?year=二零零零&month=2&day=14,要浏览2003年三月的数码能够访问/ShowBlogContent.aspx?year=二〇〇二&month=2,要查询二〇〇二年怀有数据足以访问/ShowBlogContent.aspx?year=二〇〇一。(在下载文件中提供ShowBlogContent.aspx源代码。)
接下来,当用户访问/二〇〇一/02/14.aspx时,大家需求将她走访的网站重写到/ShowBlogContent.aspx?year=二零零四&month=2&day=14上。这里必要拟订三条网址重写准绳:当钦定访问年月日时、当内定访问年月时和当内定访问年时。

澳门凯旋门游戏网址 156<RewriterConfig>
澳门凯旋门游戏网址 157        <Rules>
澳门凯旋门游戏网址 158                <!– Rules for Blog Content Displayer –>
澳门凯旋门游戏网址 159                <RewriterRule>
澳门凯旋门游戏网址 160                        <LookFor>~/(d{4})/(d{2})/(d{2}).aspx</LookFor>
澳门凯旋门游戏网址 161                        <SendTo>~/ShowBlogContent.aspx?year=$1&month=$2&day=$3</SendTo>
澳门凯旋门游戏网址 162                </RewriterRule>
澳门凯旋门游戏网址 163                <RewriterRule>
澳门凯旋门游戏网址 164                        <LookFor>~/(d{4})/(d{2})/Default.aspx</LookFor>
澳门凯旋门游戏网址 165                        <SendTo><![CDATA[~/ShowBlogContent.aspx?year=$1&month=$2]]></SendTo>
澳门凯旋门游戏网址 166                </RewriterRule>
澳门凯旋门游戏网址 167                <RewriterRule>
澳门凯旋门游戏网址 168                        <LookFor>~/(d{4})/Default.aspx</LookFor>
澳门凯旋门游戏网址 169                        <SendTo>~/ShowBlogContent.aspx?year=$1</SendTo>
澳门凯旋门游戏网址 170                </RewriterRule>
澳门凯旋门游戏网址 171        </Rules>
澳门凯旋门游戏网址 172</RewriterConfig>

那几个网址重写法则显示了正则表明式的精锐威力。第一条法则根据(\d{4})/(\d{2})/(\d{2})\.aspx格局张开寻觅,通俗的说,它寻找是不是含有相称xxxx/xx/xx.aspx格式的字符串,当中x表示数字,每一组数字必须用圆括号括起来,那样能够在对应<SendTo>节内援引圆括号内的匹配字符串。大家得以应用$1、$2、$3来分别引用后边匹配的圆括号组,个中$1,$2,$3分头表示所相称的第一、第二、第四个圆括号组。
留心:由于web.config是XML格式的文书档案,所以在文本域内务必避开直接行使一些特殊字符,如:&,<和>符号等。在率先条网站重写法则的<SendTo>节中用&amp来代表援用&符号,在其次条网站重写法则的<SendTo>节中用<![CDATA[…]]>成分来代表在这之中装有的从头到尾的经过都以文本域,不再必要用转义字符来表示援用。那二种格局都足以兑现平等的指标。
上边图五、图六、图七都体现出网址重写的运营情状。那一个数据都真实地摘自我的Blog(http://ScottOnWritting.net),图五显示2004年3月7日的帖子,图六突显全部二零零零年16月的帖子,图七显示二零零三年怀有帖子。
澳门凯旋门游戏网址 173
图五.展现二零零零年5月7日的帖子

澳门凯旋门游戏网址 174
图六. 展现二零零四年八月怀有的帖子
澳门凯旋门游戏网址 175
图七. 显示2003年抱有的帖子

只顾:要选取网站重写引擎,生硬推荐在<LookFor>节中使用正则表明式。尽管您对正则表明式不是很熟习,可以先读书作者自个儿写的一篇作品An
Introduction to Regular
Expressions
,别的还是能在RegexLib.com
上询问常用的正则表明式,或把你和谐统一希图的正则表明式提交到该站点分享利用。

1.14. 创立必须的目录结构
当IIS接收到对/贰零零贰/03/19.aspx的央求时,他发掘文件扩充名.aspx,便将该央求转交给ASP.NET引擎管理,在ASP.NET
引擎中传送时,该地方被重写到/ShowBlogContent.aspx?year=二〇〇二&month=3&day=19,最后用户将见到该Blog上2003年一月二十八日颇具的帖子,不过在用户访问/二零零三/03/时会发生什么吧?除非已经存在一个/二〇〇三/01/的目录,不然IIS将重返二个404谬误,而且该目录下还必供给有二个私下认可页面Default.aspx,IIS技巧将央求转交给ASP.NET引擎处理。
因而这种措施您得手动为每一年的Blog创设叁个寒暑的目录并在该年度下放置一个暗中同意文件Default.aspx,而且还得在该年度目录下开创每三月的目录,从01、02、…、12,每四个索引下也要谨防八个默许文件Default.aspx。(回看前面包车型地铁例子,为了将/Products/重写到/ListCategories.aspx也是要白手起家多少个/Products/目录并放置贰个私下认可Default.aspx文件。
很醒目,那样创建目录结构的进度是异常的惨恻的。化解这种主题素材的三个措施正是设置IIS将装有接收的伸手都传送给ASP.NET引擎来拍卖,这种办法,乃至连访问这种地方/2001/04/,IIS都千真万确地将其传递给ASP.NET引擎管理,这种方法造成ASP.NET引擎得管理全体传入的乞求,包罗css文件,图片文件、Javascript文件以及Flash文件等等。
有关对持有类型文件的处理的详实切磋已经高于了本书范围。有关在ASP.NET
Web应用程序中运用那些技艺的事例请访问
.Text以此开源的Blog。.Text能够透过配备将装有需要都传送给ASP.NET管理。它利用了二个自定义的HttpHandler来管理全部类型的文件类型,那几个自定义的HttpHandler能够识别并认清哪些处理全体的文件类型。(图像文件、CSS文件等等。)

1.15. 结束语
本文研究了经过类HttpContext类的RewriteUrl()艺术来落到实处ASP.NET顶尖的网址重写,正如大家所见到那么,RewriteUrl()情势在改造这一个特有的HttpContextRequest的习性时也修改了所央浼的公文和路线。实际猎取的职能正是在用户访问其有意的网站的时候,他骨子里却是在劳务器端哀告另一个与此分化的网站。
网站重写不但能够在HttpModule中进行,也能够在HttpHandler中运维。本文大家斟酌了在贰个HttpModule中施行网站重写,也切磋了一下网站重写在ASP.NET中的种种差异场地的图景。
自然,在ASP.NET一流的网站重写中,只有在IIS成功地将诉求转交给ASP.NET引擎后技术学有所成地实践,当用户诉求贰个扩大名叫.aspx的公文时那很当然地产生。不过,如若要让用户输入贰个事实上并不存在的网站,通过网站重写到另多少个设有的aspx页面,你无法不为该须要创建相应的目录和暗中认可的Default.aspx页面,除非配置IIS让它把持有的乞请都传送给IIS管理,不过这种措施盲目地将具备央求都传送给了ASP.NET引擎。

1.16. 参考
本文源代码下载地址:http://download.microsoft.com/download/0/4/6/0463611e-a3f9-490d-a08c-877a83b797cf/MSDNURLRewriting.msi
《深切钻研IIS与ASP.NET》(Inside IIS and ASP.NET) 小编:Michele Leroux
Bustamante
办事参谋:网站重写是八个颇受迎接的宗旨,不论是ASP.NET还是其余竞争对手都对其代表出了不起的酷爱。比如:Apache
Web
Server提供了一个堪当mod_rewriting的模块,mod_rewriting是个作用完善的网站重写引擎,它提供基于HTTP
头音讯和服务器参数境况的网站重写成效,乃至还提供用正则表明式来成立网址重写法规。有关mod_rewriting越来越多消息请参见A
User’s Guide to URL Rewriting with the Apache Web
Server
《Apache Web
Server网站重写用户向导》。
那边有万分数量的关于ASP.NET等级下网站重写的文章:
Rewrite.NET – A URL Rewriting Engine for
.NET
钻探模拟mod_rewriting的正则表达式描述的网址重写法则来贯彻ASP.NET下网站重写;
URL Rewriting With
ASP.NET
提供对ASP.NET下网站重写技能的总的概述;
伊恩Griffiths有贰个Blog,上面有为数十分的多关于在ASP.NET中达成网站重写的提出,举个例子本文所关联的考虑到多少回送时的做法;
Fabrice MarguerieJason
Salas
都各有三个Blog,在上头能够找到有关将ASP.NET网址重写来拉动搜索引擎的寻觅替换的篇章。
(Fabrice Marguerie:
http://weblogs.asp.net/fmarguerie/archive/2003/12/24/45712.aspx
(Jason Salas:
http://weblogs.asp.net/jasonsalas/archive/2003/12/14/43404.aspx

“>>~/ListProductsByCategoryID.aspx?CategoryID=1</SendTo>
澳门凯旋门游戏网址 176        </RewriterRule>
澳门凯旋门游戏网址 177    </Rules>
澳门凯旋门游戏网址 178</RewriterConfig>

相关文章