博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Asp.net实现URL重写
阅读量:6847 次
发布时间:2019-06-26

本文共 6829 字,大约阅读时间需要 22 分钟。

【概述】

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

【过程】
 
【方法】
1、在asp.net请求管道中重写路径
2、通过组件,如微软的UrlRewriter.dll
 
【介绍】
1、在asp.net请求管道中重写路径
要重写,首先是截获客户端请求的URL,然后分析当时的URL,最后跳转到相应的页面。这里通过自定义HttpModule来截获URL请求,并通过正则来实现URL的解析,然后转换成网站能识别的路径。
a) 在解决方案中先添加一个【类库】项目:UrlReWriter,在项目中添加类:MyUrlWriter,该类继承IHttpModule接口,代码如下:
class MyUrlWriter : IHttpModule      {            public void Init( HttpApplication context)            {                  context.BeginRequest += new EventHandler (context_BeginRequest);            }             protected void context_BeginRequest( object sender, EventArgs e)            {                  HttpApplication application = sender as HttpApplication ;                  HttpContext context = application.Context; //上下文                  string url = context.Request.Url.LocalPath; //获得请求URL                   Regex articleRegex = new Regex ("/Article/[A-Z0-9a-z_]+" ); //定义规则                  if (articleRegex.IsMatch(url))                  {                        string paramStr = url.Substring(url.LastIndexOf('/' ) + 1);                        context.RewritePath( "/Article.aspx?id=" + paramStr);                  }                  else                  {                        context.RewritePath( "/Default.aspx" );                  }            }             public void Dispose() { }      }
b) 在解决方案中添加一个网站项目,在引用中添加UrlReWriter的项目引用,然后在web.config中将自定义的HttpModule注册进去,代码如下:
1   
2
3
补充:在IIS7.0的集成模式下的配置:
c) 然后添加一个Article.aspx页面,在Article.aspx.cs类中添加输出语句,代码如下:
1       public partial class Article : System.Web.UI.Page2       {3             protected void Page_Load( object sender, EventArgs e)4             {5                   Response.Write(Request.QueryString[ "id" ]);6             }7       }
d) 最后在Default.aspx页面中添加测试链接,代码如下:
e) 项目截图如下:
f) 按【F5】运行,打开Default.aspx页,如下:
g) 点击后转到Article.aspx页面,实现重写,如下:
2、通过组件,如微软的UrlRewriter.dll
这个组件的原理和我们自定义HttpModule的原理一样,也是进入管道后拦截BeginRequest请求,然后将配置文件中的路径规则(正则表达式)引用过来,然后对请求的路径按正则进行替换成网站识别的路径。这个组件的核心代码(未翻译)如下: 
      
1     ///  2       /// Provides a rewriting HttpModule. 3       ///  4       public class ModuleRewriter : BaseModuleRewriter 5       { 6             ///  7             /// This method is called during the module's BeginRequest event. 8             ///  9             ///  The RawUrl being requested (includes path and querystring).10             ///  The HttpApplication instance. 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 rules17                   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 found29                         if (re.IsMatch(requestedPath))30                         {31                                // match found - do any replacement needed32                               string sendToUrl = RewriterUtils.ResolveUrl(app.Context.Request.ApplicationPath,re.Replace(requestedPath, rules[i].SendTo));33  34                                // log rewriting information to the Trace object35                               app.Context.Trace.Write( "ModuleRewriter" , "Rewriting URL to " + sendToUrl);36  37                                // Rewrite the URL38                               RewriterUtils.RewriteUrl(app.Context, sendToUrl);39                               break ;             // exit the for loop40                         }41                   }42  43                    // Log information to the Trace object44                   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.Page2       {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}
" , Request.QueryString["date" ])); Response.Write( string .Format("ID:{0}
" , Request.QueryString["id" ])); } }
e) 打开web.config文件,在节点<configSections>中添加一个<section>节点,代码如下:
1     
2
3
4
5
f) 在<httpHandlers>节点中加入后缀判定规则,代码如下:
1     
2
3
4
5
g) 在节点中配置URL规则,代码如下:
1     
2
3
4
5
~/Article/([A-Z0-9a-z_]+)
6
~/Article.aspx?id=$1
7 < RewriterRule> 8
9
~/News/(\d{4}-\d{2}-\d{2})/(\d{1,6})\.html?
10
~/News.aspx?date=$1 & id=$2
11
12
13
14
LooFor节点表示与请求URL匹配的路径正则,SendTo表示转换后的地址规则,$1表示LookFor正则中第一个括号匹配得到的值,$2表示LookFor正则中第二个括号匹配得到的值,熟悉正则的朋友都知道这个。
h) 最后在Default.aspx页面中添加两个测试链接,代码如下:
i) 按【F5】运行,打开Default.aspx页,如下:
j) 点击“测试文章url重写”,如下:
k) 点击“测试新闻url重写”,如下:

转载于:https://www.cnblogs.com/tinaluo/p/7469722.html

你可能感兴趣的文章
整理了一些Java软件工程师的基础知识点
查看>>
MyEclipse安装Thymeleaf插件
查看>>
java
查看>>
网络安全之CMD下的网络安全配置
查看>>
开源 java CMS - FreeCMS2.8 积分规则管理
查看>>
我的友情链接
查看>>
我的友情链接
查看>>
warning C4273: ****.dll链接不一致
查看>>
汽车常识全面介绍 - 动力系统
查看>>
搞懂word-break、word-wrap、white-space
查看>>
七字箴言与六字箴言
查看>>
局域网下载控制好帮手--超级嗅探狗
查看>>
javabean的设计
查看>>
firebug的使用方法
查看>>
Python基础知识两部曲:二
查看>>
cocos2d-x源码分析2
查看>>
[转载] 中华典故故事(孙刚)——38 最毒妇人心
查看>>
mybatis 与spring整合
查看>>
3-16高项作业本
查看>>
用Advanced Installer制作DotNetBar for Windows Forms 12.0.0.1_冰河之刃重打包版详解
查看>>