zoukankan      html  css  js  c++  java
  • URLRewriter实现机制

         ms的URLRewriter可实现地址重定向,在网站建设中很容易被搜索引擎收录,而且方便有记忆有统一风格。MS的URLRewriter使用方法可查资料,本文主要讨论URLRewriter实现,URLRewriter还有一个不方便之处就是只可对单一的文件类型过滤跳转。在自己实现URLRewriter时改造这个问题。

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

          一个网站中可能要对多种类型扩展名的地址进行重定向,用HttpHandler对指定扩展名进行截取处理,在很多项目中也许不是最佳的处理,还有一点地址重定向页很多,单设一个配置文件进行。全部放在web.config里太乱了,而且效率不高。

         可以考虑在HttpModule BeginRequest中处理当得到一个来自客户端请求时。
    1,过滤扩展名(如果不是指定扩展名的早早抛出)
    2.初始化配置文件(读取自定义配置信息)
    3.对地址进行正则表达式配对处理。
    4.关键一步Match.Result 处理得到就是一个转向地址

    几点说明,
    1.得到请求原地址信息 Request.rawUrl
    2.内部地址跳转context.Rewritepath
    3.Match.Result 返回已传递的替换模式的扩展。例如,如果替换模式为 $1$2,则 Result 返回 Groups[1].Value 和 Groups[2].Value(MSDN)
    4.自定义URLRewriter时对MS的原配置文件改造一下 如下

    代码
    <Rules AllowExtension="aspx,htm">
    <RewriterRule>
    <LookFor>~/WebForm2_(\d{5,8}|[a-z0-9_]+)/discussion/?$</LookFor>
    <SendTo>~/ajax/WebForm1.aspx?movieid=$1&amp;pageIndex=1</SendTo>
    </RewriterRule>
    </Rules>

        AllowExtension 属性是充许跳转的扩展名,其它类型不进行地址重定向。

    代码
    foreach (RewriteRule rule in rules)
    {
    Match m
    = rule.LookForRegex.Match(context.Request.AppRelativeCurrentExecutionFilePath);
    if (m.Success)
    {
    string sendTo = m.Result(rule.SendTo);

    if (context.Request.QueryString.Count >0)
    {
    if (sendTo.IndexOf('?') !=-1)
    sendTo
    +="&"+ context.Request.QueryString.ToString();
    else
    sendTo
    +="?"+ context.Request.QueryString.ToString();
    }
    context.RewritePath(sendTo);
    break;
    }
    }

      RewriteRule 里面就是读取到配置信息,包括了全部LookFor SendTo,当然最后把传入参数并到sendto上。

  • 相关阅读:
    js中给一个元素添加事件
    asp.net客户端回调
    (转)web元素之input (javascript)功能
    在wcf中使用基于证书的授权和保护
    (转)IE与FireFox的js和css几处不同点
    IE&FF兼容性问题
    solaris UFS文件系统 要点
    perl命令行 代替 各种shell 一则
    nginx中的验证模块
    漂亮的正则,素数查找
  • 原文地址:https://www.cnblogs.com/shouhongxiao/p/1728325.html
Copyright © 2011-2022 走看看