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上。

原文地址:https://www.cnblogs.com/shouhongxiao/p/1728325.html