现在的位置: 首页 > 综合 > 正文

新瓶装老酒之ASP.NET Url重写

2012年01月20日 ⁄ 综合 ⁄ 共 3140字 ⁄ 字号 评论关闭

      最近,朋友的搜索引擎快开发完成。现在还有些前台的工作需要完成。比如说搜索界面,展示界面,数据分页,搜索建议等等。因为整个产品是基于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节点。结构如下

 

<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处理

<add verb="*" path="s" type="URLRewriter.RewriterFactoryHandler,URLRewriter" /> 

    4:在modules节点添加以下配置,

<add name="ModuleRewriter" type="URLRewriter.ModuleRewriter,URLRewriter" />

      5:在handlers节点下配置以下节点。

<add name="urlrequestc" verb="*" path="s" type="URLRewriter.RewriterFactoryHandler,URLRewriter" />

     经过以上配置,当在地址栏请求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类文件。如果需要调试跟踪,可以附加到自己的项目中,需要可以在这里下载。

    酒装的不好,希望大家多多指点。欢迎拍砖。

抱歉!评论已关闭.