Asp.net实现URL重写

原文: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。

有些东西,你能写出来和表述出来才能说你会了。

希望对大家有帮助,谢谢支持。

时间: 2024-12-13 15:30:52

Asp.net实现URL重写的相关文章

asp.net 页面url重写

不更改情况下,页面路径为index.aspx?id=1,现在输入页面路径index/1时,也能访问到页面,这一过程叫做url重写 ①:在一个类里制定路径重写规则,以下为自定义UrlRewriterFilter类,需要继承接口IHttpModule ②:在配置文件里面configuration节点里进行配置(如果自定义类是在另一个类库里面写的,则需要将该类库的.dll文件生成路径改为和启动项.dll文件路径一致) 另外,asp.net的url重写还可以直接在网站发布的时候,进行IIS  选择url

ASP.NET MVC URL重写与优化(初级篇)-使用Global路由表定制URL

ASP.NET MVC URL重写与优化(初级篇)-使用Global路由表定制URL 引言--- 在现今搜索引擎制霸天下的时代,我们不得不做一些东西来讨好爬虫,进而提示网站的排名来博得一个看得过去的流量. URL重写与优化就是搜索引擎优化的手段之一. 假如某手机网站(基于ASP.NET MVC)分类页面URL是这样的, http://www.xxx.com/category/showcategory?categoryid=1000&view=list&orderby=price&p

ASP.NET MVC URL重写与优化(进阶篇)-继承RouteBase玩转URL

http://www.cnblogs.com/John-Connor/archive/2012/05/03/2478821.html 引言-- 在初级篇中,我们介绍了如何利用基于ASP.NET MVC的Web程序中的Global文件来简单的重写路由.也介绍了它本身的局限性-依赖于路由信息中的键值对: 如果键值对中没有的值,我们无法将其利用凑出我们想要的URL表达式. 初级篇传送门:使用Global路由表定制URL   在进阶篇中,我们将介绍ASP.NET 路由相关类的基类-抽象类RouteBas

ASP.NET HttpModule URL 重写 (一) 【Z】

大家好,又来和大家见面了,此次给大家带来的URL重写,关于URL重写是什么,有什么好处,如何重写,今天我和大家一起分享一下我的经验 一.URL重写 URL重写就是首先获得一个进入的URL请求然后把它重新写成网站可以处理的另一个URL的过程.举个例子来说,如果通过浏览器进来的URL是“UserProfile.aspx?ID=1”那么它可以被重写成 “UserProfile/1.aspx”. 二.URL重写优点 1.有利于百度.谷歌等搜索引擎收录于抓取,如果你是网站优化高手的化,这就是基本功了...

【转】Asp.net实现URL重写

[概述] URL重写就是首先获得一个进入的URL请求然后把它重新写成网站可以处理的另一个URL的过程.重写URL是非常有用的一个功能,因为它可以让你提高搜索引擎阅读和索引你的网站的能力:而且在你改变了自己的网站结构后,无需要求用户修改他们的书签,无需其他网站修改它们的友情链接:它还可以提高你的网站的安全性:而且通常会让你的网站更加便于使用和更专业. [过程] 实现 1.新建一个 [ASP.NET 空Web应用程序]项目:WebApp,并添加一个1.html的文件 2. 在解决方案中先添加一个[类

ASP.NET中Url重写后,打不开真正的Html页面

不对IIS配置.html的映射,IIS站点目录下.html页面都能显示.当配置了.html的映射 IIS站点目录下真实存在的.html页面无法显示,错误信息:“页面无法显示”解决方法:1.首先照旧在网站配置的应用程序扩展名映射中添加扩展名.html映射到aspnet_isapi.dll,是否存在不选: 2.在web.config文件中<compilation>节点下添加code:<buildProviders>        <add extension=".htm

二:理解ASP.NET的运行机制(例:基于HttpHandler的URL重写)

url重写就是把一些类似article.aspx?id=28的路径重写成 article/28/这样的路径 当用户访问article/28/的时候我们通过asp.net把这个请求重定向到article.aspx?id=28路径有两种方法可以做这件事情 一:基于HttpModule的方案这个方案有有缺点,具体缺点以后再谈我曾写过一篇文章<不用组件的url重写(适用于较大型项目) >就是按这个模式写的 二:基于HttpHandler的方案我们这个例子就是按这个方案做的我们接下来就按这种方式做这个例

ASP.NET 中执行 URL 重写

具体实现步骤(其中的一种实现方法): 一.下载相关的DLL(ActionlessForm.dll和UrlRewriter.dll) http://download.csdn.net/detail/yingwanghbx/4510059 二.在项目中引用那两个DLL文件 右击项目,点击Add Reference,选择Browse,然后选择相应的DLL,点击OK即可. 三.添加browser文件 1.右击项目,点击Add-New Item,选择Browser File,取个有意义的名字.在生成的*.

ASP.NET Core中使用URL重写

ASP.NET Core 1.1 Preview 1 中新增了 URL Rewriting middleware ,终于可以进行 URL 重写了,实际使用体验一下. 首先要将 ASP.NET Core 项目升级至 .NET Core 1.1 Preview 1(参考 .NET跨平台之旅:将示例站点升级至 .NET Core 1.1 Preview 1 ),然后在 project.json 添加 "Microsoft.AspNetCore.Rewrite" 的引用并运行 donet re