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
  • 相关阅读:
    mysq 日期相减
    说说时间观与时间管理——北漂18年(71)
    ionic之切换开关
    ionic之单选框
    SELECT ... LOCK IN SHARE MODE和SELECT ... FOR UPDATE locks在RR模式下可以看到最新的记录
    14.5.2.3 Consistent Nonlocking Reads 一致性非锁定读
    14.5.2.2 autocommit, Commit, and Rollback
    14.5.2 事务隔离级别
    对于唯一索引使用唯一条件搜索, InnoDB 只锁定找到的index record,不是它之前的区间
    mysql explain 解释
  • 原文地址:https://www.cnblogs.com/hedianzhan/p/8400266.html
Copyright © 2011-2022 走看看