新瓶装老酒之ASP.NET Url重写
最近,朋友的搜索引擎快开发完成。现在还有些前台的工作需要完成。比如说搜索界面,展示界面,数据分页,搜索建议等等。因为整个产品是基于C#开发的,所以在做搜索页面(Search.aspx)通过查询字符串wd来查询。参考Baidu的搜索页面,比如说搜索博客园,就会在地址栏显示http://www.baidu.com/s?wd=博客园,通过wd定位搜索的关键字。如是想着把我们的Search.aspx,做成s?wd=博客园的样子,有什么好处呢?有很多,此处省略100字。采用什么技术,我用的是URLRewriter。
要使用URLRewriter,首先要把URLRewriter添加到引用。然后在web.config中添加响应的配置节。要使当在地址栏输入http://www.applls.com/s?wd=博客园,自动在Search.aspx处理发的请求。我是按以下操作配置的,我的测试环境 Win7+IIS7.0+VS2008。
1:在configSections节点中添加 <section name="RewriterConfig" requirePermission="false" type="URLRewriter.Config.RewriterConfigSerializerSectionHandler,URLRewriter" />节点。name的名称是可以随意更改的。
2:根据自己要匹配的Url配置映射。我在地址栏要匹配s?wd=博客园, 在configuration中添加 在第1步section节点的和name名称相同的RewriterConfig节点。结构如下
<Rules>
<RewriterRule>
<LookFor>~/s?wd=([a-z,A-Z,0-9]+)</LookFor>
<SendTo>~/demo.aspx?wd=$1</SendTo>
</RewriterRule>
<RewriterRule>
<LookFor>~/s</LookFor>
<SendTo>~/demo.aspx</SendTo>
</RewriterRule>
</Rules>
</RewriterConfig>
3:在httpHandlers节点配置以下节点,意思是对s的请求由URLRewriter.RewriterFactoryHandler,URLRewriter处理
4:在modules节点添加以下配置,
5:在handlers节点下配置以下节点。
经过以上配置,当在地址栏请求s?wd=博客园时,后台会自动在search.aspx页面处理。
扩展下,
1:如果在地址栏请求([a-z,A-Z,0-9]+).aspx文件,都映射到Demo.aspx页面处理。添加新的配置
<RewriterRule>
<LookFor>~/([a-z,A-Z,0-9]+).aspx</LookFor>
<SendTo>~/demo.aspx?wd=$1</SendTo>
</RewriterRule>
在httpHandlers里加入<add verb="*" path="*.aspx" type="URLRewriter.RewriterFactoryHandler,URLRewriter" />
在handlers里加入<add name="urlrequest" verb="*" path="*.aspx" type="URLRewriter.RewriterFactoryHandler,URLRewriter" />
就可解决问题。
2:如果在地址栏请求([a-z,A-Z,0-9]+).html,都映射到Demo.aspx页面处理,这个就是所谓的伪静态化。
<RewriterRule>
<LookFor>~/([a-z,A-Z,0-9]+).html</LookFor>
<SendTo>~/demo.aspx?wd=$1</SendTo>
</RewriterRule>
在httpHandlers里加入<add verb="*" path="*.html" type="URLRewriter.RewriterFactoryHandler,URLRewriter" />
在handlers里加入<add name="urlrequest" verb="*" path="*.html" type="URLRewriter.RewriterFactoryHandler,URLRewriter" />
可解决以上问题。
3:如果请求指定后缀文件如([a-z,A-Z,0-9]+).yoolo,都映射到Demo.aspx页面处理。利用这个,以后我们开发aspx页面就可以把后缀定义成我们喜欢的后缀了。
<RewriterRule>
<LookFor>~/([a-z,A-Z,0-9]+).yoolo</LookFor>
<SendTo>~/demo.aspx?wd=$1</SendTo>
</RewriterRule>
在httpHandlers里加入<add verb="*" path="*.yoolo" type="URLRewriter.RewriterFactoryHandler,URLRewriter" />
在handlers里加入<add name="urlrequest" verb="*" path="*.yoolo" type="URLRewriter.RewriterFactoryHandler,URLRewriter" />
另外说明一下,
现象A:web.config配置节中 httpHandlers 和 Handlers 的区别。在看下了MSDN 的帮助文档,上面说httpHandlers 是基于IIS6.0以前的配置,而Handlers 是基于IIS7.0的配置。所以在匹配每个映射的时候 httpHandlers 和 Handlers 都要各自配置一次。
现象B:在配置映射时,如果只配置 handlers节点 而不配置 httpHandlers。IIS7.0下是可以进行URL重写的。启动VS2008浏览页面而无法进行URL重写。所以我估计VS2008启动的端口是模拟IIS6.0的web服务环境,它和IIS7.0是不同的。
基于以上两种现象不知道自己理解的是否正确。URL重写 还有一些其他应用,大家也可以跟帖说明下。
URLRewriter整个Dll的代码很短,所以就反编译了下,并生产了cs类文件。如果需要调试跟踪,可以附加到自己的项目中,需要可以在这里下载。
酒装的不好,希望大家多多指点。欢迎拍砖。