zoukankan      html  css  js  c++  java
  • Asp.net实现URL重写

    【概述】

    URL重写就是首先获得一个进入的URL请求然后把它重新写成网站可以处理的另一个URL的过程。重写URL是非常有用的一个功能,因为它可以让你提高搜索引擎阅读和索引你的网站的能力;而且在你改变了自己的网站结构后,无需要求用户修改他们的书签,无需其他网站修改它们的友情链接;它还可以提高你的网站的安全性;而且通常会让你的网站更加便于使用和更专业。

    【过程】
     
    【方法】
    1、在asp.net请求管道中重写路径
    2、通过组件,如微软的UrlRewriter.dll
     
    【介绍】
    1、在asp.net请求管道中重写路径
    要重写,首先是截获客户端请求的URL,然后分析当时的URL,最后跳转到相应的页面。这里通过自定义HttpModule来截获URL请求,并通过正则来实现URL的解析,然后转换成网站能识别的路径。
    a) 在解决方案中先添加一个【类库】项目:UrlReWriter,在项目中添加类:MyUrlWriter,该类继承IHttpModule接口,代码如下:
    复制代码
     1      class MyUrlWriter : IHttpModule
     2       {
     3             public void Init( HttpApplication context)
     4             {
     5                   context.BeginRequest += new EventHandler (context_BeginRequest);
     6             }
     7  
     8             protected void context_BeginRequest( object sender, EventArgs e)
     9             {
    10                   HttpApplication application = sender as HttpApplication ;
    11                   HttpContext context = application.Context; //上下文
    12                   string url = context.Request.Url.LocalPath; //获得请求URL
    13  
    14                   Regex articleRegex = new Regex ("/Article/[A-Z0-9a-z_]+" ); //定义规则
    15                   if (articleRegex.IsMatch(url))
    16                   {
    17                         string paramStr = url.Substring(url.LastIndexOf('/' ) + 1);
    18                         context.RewritePath( "/Article.aspx?id=" + paramStr);
    19                   }
    20                   else
    21                   {
    22                         context.RewritePath( "/Default.aspx" );
    23                   }
    24             }
    25  
    26             public void Dispose() { }
    27       }
    复制代码
    b) 在解决方案中添加一个网站项目,在引用中添加UrlReWriter的项目引用,然后在web.config中将自定义的HttpModule注册进去,代码如下:
    1   <httpModules >
    2         <add name = "UrlReWriter " type =" UrlReWriter.MyUrlWriter,UrlReWriter " />
    3    </httpModules >
    c) 然后添加一个Article.aspx页面,在Article.aspx.cs类中添加输出语句,代码如下:
    复制代码
    1       public partial class Article : System.Web.UI.Page
    2       {
    3             protected void Page_Load( object sender, EventArgs e)
    4             {
    5                   Response.Write(Request.QueryString[ "id" ]);
    6             }
    7       }
    复制代码
    d) 最后在Default.aspx页面中添加测试链接,代码如下:
    1 <a href ="/Article/35">测试url重写</a>
    e) 项目截图如下:
    f) 按【F5】运行,打开Default.aspx页,如下:
    g) 点击后转到Article.aspx页面,实现重写,如下:
    2、通过组件,如微软的UrlRewriter.dll
    这个组件的原理和我们自定义HttpModule的原理一样,也是进入管道后拦截BeginRequest请求,然后将配置文件中的路径规则(正则表达式)引用过来,然后对请求的路径按正则进行替换成网站识别的路径。这个组件的核心代码(未翻译)如下: 
          
    复制代码
     1     /// <summary>
     2       /// Provides a rewriting HttpModule.
     3       /// </summary>
     4       public class ModuleRewriter : BaseModuleRewriter
     5       {
     6             /// <summary>
     7             /// This method is called during the module's BeginRequest event.
     8             /// </summary>
     9             /// <param name="requestedRawUrl"> The RawUrl being requested (includes path and querystring).</param>
    10             /// <param name="app"> The HttpApplication instance. </param>
    11             protected override void Rewrite( string requestedPath, System.Web.HttpApplication app)
    12             {
    13                    // log information to the Trace object.
    14                   app.Context.Trace.Write( "ModuleRewriter" , "Entering ModuleRewriter");
    15  
    16                    // get the configuration rules
    17                   RewriterRuleCollection rules = RewriterConfiguration.GetConfig().Rules;
    18  
    19                    // iterate through each rule...
    20                   for (int i = 0; i < rules.Count; i++)
    21                   {
    22                          // get the pattern to look for, and Resolve the Url (convert ~ into the appropriate directory)
    23                         string lookFor = "^" + RewriterUtils.ResolveUrl(app.Context.Request.ApplicationPath, rules[i].LookFor) + "$" ;
    24  
    25                          // Create a regex (note that IgnoreCase is set...)
    26                         Regex re = new Regex(lookFor, RegexOptions.IgnoreCase);
    27  
    28                          // See if a match is found
    29                         if (re.IsMatch(requestedPath))
    30                         {
    31                                // match found - do any replacement needed
    32                               string sendToUrl = RewriterUtils.ResolveUrl(app.Context.Request.ApplicationPath,re.Replace(requestedPath, rules[i].SendTo));
    33  
    34                                // log rewriting information to the Trace object
    35                               app.Context.Trace.Write( "ModuleRewriter" , "Rewriting URL to " + sendToUrl);
    36  
    37                                // Rewrite the URL
    38                               RewriterUtils.RewriteUrl(app.Context, sendToUrl);
    39                               break ;             // exit the for loop
    40                         }
    41                   }
    42  
    43                    // Log information to the Trace object
    44                   app.Context.Trace.Write( "ModuleRewriter" , "Exiting ModuleRewriter");
    45             }
    46       }
    复制代码
    a) 先想办法得到一个UrlRewriter.dll,通过http://download.microsoft.com/download/0/4/6/0463611e-a3f9-490d-a08c-877a83b797cf/MSDNURLRewriting.msi下载。下载得到的是一个用vs2003开发的源文件,可以用vs2008或者更高版本编译器转换后,生成解决方案,在bin目录中生成UrlRewriter.dll文件。
    b) 新建一个网站项目,添加引用第一步产生的UrlRewriter.dll文件,添加Article.aspx、News.aspx页面。
    c) 在Article.aspx后台代码中添加一行输出方法,代码如下:
    复制代码
    1       public partial class Article : System.Web.UI.Page
    2       {
    3             protected void Page_Load( object sender, EventArgs e)
    4             {
    5                   Response.Write(Request.QueryString[ "id" ]);
    6             }
    7       }
    复制代码
    d) 在News.aspx后台代码中添加一行输出方法,代码如下:
    复制代码
          public partial class News : System.Web.UI.Page
          {
                protected void Page_Load( object sender, EventArgs e)
                {
                      Response.Write( string .Format("日期:{0}<br/>" , Request.QueryString["date" ]));
                      Response.Write( string .Format("ID:{0}<br/>" , Request.QueryString["id" ]));
                }
          }
    复制代码
    e) 打开web.config文件,在节点<configSections>中添加一个<section>节点,代码如下:
    1     <configuration>
    2       <configSections>
    3         <section name = "RewriterConfig " type =" URLRewriter.Config.RewriterConfigSerializerSectionHandler,URLRewriter " />
    4       </configSections>
    5     </configuration>
    f) 在<httpHandlers>节点中加入后缀判定规则,代码如下:
    1     <httpHandlers>
    2       <remove verb = "* " path = "*.asmx " />
    3       <add verb = "* " path = "* " type = "URLRewriter.RewriterFactoryHandler, URLRewriter" />
    4       <add verb = "* " path = "*.html " type =" URLRewriter.RewriterFactoryHandler, URLRewriter " />
    5     </httpHandlers>
    g) 在节点中配置URL规则,代码如下:
    复制代码
     1     <configuration>
     2        <RewriterConfig>
     3          <Rules>
     4                 <RewriterRule>
     5                        <LookFor>~/Article/([A-Z0-9a-z_]+) </LookFor>
     6                        <SendTo>~/Article.aspx?id=$1 </SendTo>
     7                 < RewriterRule>
     8                 <RewriterRule>
     9                        <LookFor>~/News/(d{4}-d{2}-d{2})/(d{1,6}).html? </LookFor>
    10                        <SendTo>~/News.aspx?date=$1 &amp; id=$2</SendTo>
    11                 </RewriterRule>
    12          </Rules>
    13        </RewriterConfig>
    14   </configuration>
    复制代码
    LooFor节点表示与请求URL匹配的路径正则,SendTo表示转换后的地址规则,$1表示LookFor正则中第一个括号匹配得到的值,$2表示LookFor正则中第二个括号匹配得到的值,熟悉正则的朋友都知道这个。
    h) 最后在Default.aspx页面中添加两个测试链接,代码如下:
    1         <a href ="<% = ResolveUrl("Article/35")%> "> 测试文章url重写</a>< br />
    2         <a href ="<% = ResolveUrl("News/2014-06-11/285864.html")%> "> 测试新闻url重写</a>
    i) 按【F5】运行,打开Default.aspx页,如下:
    j) 点击“测试文章url重写”,如下:
    k) 点击“测试新闻url重写”,如下:
     
    【总结】
    这个知识点很简单,很多大牛们也写过,这篇文章也参考了几位高手的博客,然后自己写了两个demo。
    有些东西,你能写出来和表述出来才能说你会了。
    希望对大家有帮助,谢谢支持。
    出处:https://www.cnblogs.com/maitian-lf/p/3782012.html
  • 相关阅读:
    区块链100篇之第四篇--矿工及挖矿
    区块链100篇之第三篇--数字签名
    区块链100篇之第二篇--P2P与比特币的支付与交易
    区块链100篇之第一篇--序(比特币)
    Bootstrap
    网页布局笔记
    element-ui中用el-dialog+el-table+el-pagination实现文件默认选中且在分页的条件下有记忆功能
    css中border画三角形
    border画梯形
    this作用范围
  • 原文地址:https://www.cnblogs.com/hedianzhan/p/8400266.html
Copyright © 2011-2022 走看看