郭乐明
(浙江农业商贸职业学院,浙江 绍兴 312000)
运用ASP.NET进行URL重写的技术实现
郭乐明
(浙江农业商贸职业学院,浙江 绍兴 312000)
本文阐述了URL重写(URL Rewriting)的用处:使URL简单易记;防止黑客攻击;满足搜索引擎需要;提高网站可移植性;防止盗链;使URL支持“可删节”的需求.本文分析了ASP.NET实现URL重写的机制,并重点论述了用ASP.NET进行URL重写的技术实现.
ASP.NET;URL Rewriting;ISAPI;IIS;HTTP Module;HTTP Handler
URL重写,实质上是将网页真实URL隐藏起来,使用户通过相应的虚拟URL(VirtualURL)访问网页资源,以便克服真实URL的许多不足.具体来讲,URL重写有以下几点用处:
1.1 满足搜索引擎需要,实现搜索引擎中排名优化.目前很多搜索引擎不支持动态链接,无法抓取动态网页,尤其是带“?”查询参数的网页,使网站许多信息无法被用户搜索到.即使搜索引擎支持动态链接,比如Google,它抓取动态网页的优先度也远远低于静态网页,这样就使动态网页的排名远远落后于静态网页.而URL重写很大程度上是用于将动态链接转换成静态链接,这将使得搜索引擎尽可能深地抓取网站子栏目的内容,使网页在搜索结果中排名靠前.
1.2 隐藏网页实现技术,增强网站安全性.如果网页上带着像.jsp/.asp/.aspx这样的扩展名,让人一看就知道网站是用什么技术实现的.但如果将http://server/test.aspx?id=3重写成http://server/test/3.htm,使黑客无法知晓网页的实现技术,大大降低了网页受攻击的可能性.
1.3 提高网站的移植性.由于真实URL含有实现技术语言的后缀信息(如.aspx/.asp/.jsp),当网站改变技术实现语言的时候,需要改动大量的链接,比如从.net平台的.aspx转成java平台的.jsp.而且,如果页面修改了扩展名,那么对于搜索
引擎而言就是一个新页面,它原先在搜索引擎中的PageR-ank也会随之消失,从头开始排名.如果用URL重写技术隐藏技术实现细节,修改移植就会很方便,而且完全不损失PageRank.
1.4 防止盗链.所谓盗链,是指盗用其他网站上相应资源的URL链接为自己网站所用.比如将别人网站上的图片或声音的URL写入自己的网页代码,使用户在访问网站时,能直接获得被盗用网站的资源.如果一个网站的资源经常被其他网站盗链,那么网站的性能将会大大下降.而如果将真实URL重写成虚拟URL,甚至附带强大的站外链接过滤功能,就可以防止盗链.
1.5 使URL简单易记,增加URL美感.比如可以把“http: //server/Detail.aspx?year=2009&month=12&day=30”重写成“http: //server/2009/12/30/”,这样,用户可以相当方便地访问网站.
1.6 使URL支持“可删节”的需求[1,2].“可删节”是一种极其重要的用户需求,通过URL重写,可以实现这种需求.比如将上例“http://server/2009/12/30/”中的日期删除,变成“http: //server/2009/12/”,能列出2009年12月的内容;继续删除URL中的月份,变成“http://server/2009/”,能列出2009年的内容等.
如图1所示,当IIS(Internet服务管理器)接收到一个Web请求时,IIS 通过ISAPI筛选器(ISAPI Filter)检查被请求文件的扩展名以确定如何处理该请求.IIS可以自行处理静态资源的请求(如HTML页面、图像),或者将请求传递到ISAPI扩展(ISAPIExtension).比如asp文件使用asp.dll ISAPI扩展.对于ASP.NET文件,IIS会将请求传给aspnet_isapi.dll ISAPI扩展.然后aspnet_isapi.dll将处理操作传递给托管的ASP.NET进程(aspnet_wp.exe),该进程读取machine.config和web.config中配置的多个HTTP模块(HTTP Module),用对应的HTTP处理器(HTTP Handler)处理请求,并将处理结果(如由ASP.NET网页生成的HTML代码)返回给客户端.[2,3]
由图1可见,实现URL重写的关键是ISAPI:ISAPI Filter和ISAPI Extension,但是,ISAPI的开发和部署比较困难,在ISAPIFilter上实现URL重写难度比较大.由于ASP. NET引擎与IIS非常相似[2],所以可以利用ASP.NET的HTTP Module或HTTP Handler实现URL重写.其中,HTTP Module实现了类似于ISAPI Filter的功能,HTTP Handler实现了类似于ISAPI Extension的功能.
为了实现URL重写,ASP.NET需要创建和注册自定义HTTP Module或HTTP Handler,以便完成以下操作[2]:
(1)检查被请求的路径,以确定URL是否需要重写.
(2)如果URL需要重写,可以调用System.Web.Http-Context类的RewritePath()方法来重写路径.
3.1 为URL重写指定配置信息.在创建自定义HTTP Module或HTTP Handler之前,必须在machine.config(影响整个Web服务器)或web.config(针对特定的Web应用程序)的configuration/system.web 部分设置配置信息[5]:
或者:
3.2 编写URL重写规则.为了能使URL正确被重写,需要在web.config或其他文件中编写URL重写规则,以便确定需要重写的URL地址和URL转发的地址.一般使用可以序列化(Serializable)的结构:
3.3 选择合适的URL重写时机.由于ASP.NET不同的身份验证(Authorize)和文件授权方式(Authenticate)会对URL重写产生影响[2],所以应选择Global.asax文件中合适的事件来执行URL重写.
如果使用Windows身份验证和文件授权方式,则最好使用HTTP Module进行URL重写,而且必须由BeginRequest事件或AuthenticateRequest事件执行URL重写.对于窗体(Forms)验证,HTTP Module最好是由AuthorizeRequest事件执行重写.[2,7]
3.4 自定义URL重写方法.以HTTP Module为例:
URLRules rules=…… //用自定义的URLRules类获得3.2节的URL重写规则
//用自定义的Helper.Resolve方法将rules[i].Url转换为相应的目录
则,则进行相应替换
3.5 在Global.asax相应事件中执行自定义的URL重写方法.例如:
本文详细阐述了URL重写的用处.实现机制和方法. URL重写之所以能在ASP.NET上实现,关键在于能利用ASP.NET的HttpContext类RewritePath()方法来重写路径,而无须改动复杂的ISAPI.然而,上述方法只针对一些扩展名的URL重写,如果要想处理所有文件类型的URL重写,甚至控制静态文件类型,则需要在上述基础上更为复杂的技术设置.
〔1〕Jakob Nielsen.URL asUI[DB/OL].http://www.useit. com/alertbox/990321.html.
〔2〕Scott Mitchell.URL Rewriting in ASP.NET[DB/OL].http://msdn.microsoft.com/library/default.asp?url=/library/enus/dnaspp/html/urlrewriting.asp.
〔3〕Michele Leroux Bustamante.Inside IIS&ASP.NET[DB/ OL].http://www.theserverside.net/articles/showarticle.tss? id=IIS_ASP.
〔4〕孙亚民.ASP.Net中自定义Http处理及其应用[DB/OL]. http://www.uml.org.cn/
〔5〕Microsoft.http://msdn.microsoft.com/library/
〔6〕Mansoor Ahmed Siddiqui.HTTP Handlers and HTTP Modulesin ASP.NET[DB/OL].http://www.15seconds. com/issue/020417.htm
〔7〕Richard Birkby.URL Rewriting with ASP.NET[DB/OL].http://www.codeproject.com/aspnet/URLRewriter.asp.
TP393.092
A
1673-260X(2010)05-0019-02