使用UrlRewriter进行Url重写的完整解决方案[转]

Setp 1:

下载UrlRewriter => http://urlrewriter.net/

Setp 2:

将其添加到Web项目的Bin目录下

Setp 3:

配置:打开web.config,在configSecions中添加sectionHandler:

<section name="rewriter" requirePermission="false" type="Intelligencia.UrlRewriter.Configuration.
RewriterConfigurationSectionHandler, Intelligencia.UrlRewriter" />

添加这个section是为了它能够处理web.config中的节;然后对UrlRewriter配置url重写规则:

<rewriter>
    <rewrite url=”~/lmh$” to=”~/Users.aspx?user=lmh” processing=”stop” />
</rewriter>

url是可以使用正则表达式的。比如上面的例子,就是将http://www.***.net/lmh重写到http://www.***.net/Users.aspx?user=lmh,$在正则表达式中表示是串的结束,也就是说http://www.***.net/lmhe是不会被重写到to后的地址的,如果把$去掉则可以。

Setp 4:

使rewriter生效:UrlRewriter是在HttpModule中做url重写的,要使重写生效,就得先把HttpModule添加到web.config中:

<httpModules>
    <add name="UrlRewriter" type="Intelligencia.UrlRewriter.RewriterHttpModule, Intelligencia.UrlRewriter"/>
</httpModules>

Setp 5:

让ReWriter有机会重写Url: 当iis收到一个请求时,并不是都会扔给asp.net(aspnet_isapi.dll)来处理,比如静态html,默认情况下,当请求html页面时,iis直接就把结果抛给了客户端,之所以.aspx页面会被asp.net引擎处理,是因为在iis有进行处理程序映射,.aspx被映射到aspnet_isapi.dll,所以当iis收到请求时,先看后缀名,如果是aspx,那就把它交给aspnet_isapi.dll来处理。因为UrlRewriter是asp.net级别的重写组件,所以,假如要想执行setp3中例子那样的重写,得先让UrlRewriter有机会收到这个地址的请求才行(默认UrlRewriter是没机会处理这个url的,因为iis收到这个地址的请求时,因为它没有映射到aspnet_isapi.dll,所以会直接抛出404找不到的错误,因此,要替它做这个映射。打开iis,在属性中有这一项,我们可以让*映射到aspnet_isapi.dll,这样所有的文件都交给asp.net来处理了,UrlRewriter也就有机会出手了。

如果用的是IIS7.0,则不用这么麻烦,整个Setp4可以简化为:在web.config中的节的节中添加上UrlRewriter:.webserver>

<add name="UrlRewriter" type="Intelligencia.UrlRewriter.RewriterHttpModule, Intelligencia.UrlRewriter"/>

这会保证所有的请求都会经过asp.net的这个Module。

现在,重写就算基本完成了,但有几个问题:

Problem 1:

 图片可能不显示:如果进行Url Rewirte并且页面中的图片引用是使用相对路径的话,很可能会发现图片无效了,这是因为,假如/Users/lmh会被重写为/Users.aspx?user=lmh,而Users.aspx上有一张图片,放在相同目录下:logo.gif,(Users.aspx中是<img src='logo.gif' />)那当请求/Users/lmh时,浏览器对logo.gif的请求的路径将变成/Users/logo.gif,而实际上logo.gif是要用/logo.gif才能请求得到的,所以,为了保证Url rewrite后不会出现这个问题,需要使用<img src='/logo.gif' />,但是当使用UrlRewriter时,对于Css,如果代码中是,而实际用Users/lmh去请求的话,会发现其实已经变成了,而图片,如果是用的服务器控件的话,也可以继续使用相对路径,就不存在标题中的问题。

Problem 2:

Asp.net的postback会导致真实地址又被嚗光:还是setp3的例子,假设Users.aspx中有一个服务器按钮控件,当第一次请求时,确实OK,但是一旦点击了那个按钮,地址栏又变成了http://www.***.net/Users.aspx?user=lmh,原因是asp.net的服务器form控件的action默认都是指定当前页面地址的,虽然我们收到的请求是…/lmh,但经过UrlRewrite后,asp.net处理的已经是真实的地址:…/Users.aspx?user=lmh,所以在form被Render时,action会是../Users.aspx?user=lmh,那么,要解决这个问题,就是让form的action的值也被render为请求的地址,这个网上已经有答案了,就是利用ControlAdapter(写在App_Code中即可,不过为了重用,可以放到类库项目中):



 1    public class FormRewriterControlAdapter : System.Web.UI.Adapters.ControlAdapter
 2    {
 3        protected override void Render(HtmlTextWriter writer)
 4        {
 5            base.Render(new RewriteFormHtmlTextWriter(writer));
 6        }
 7    }
 8 
 9    public class RewriteFormHtmlTextWriter : HtmlTextWriter
10    {
11        public RewriteFormHtmlTextWriter(HtmlTextWriter writer)
12            : base(writer)
13        {
14            this.InnerWriter = writer.InnerWriter;
15        }
16 
17        public override void WriteAttribute(string name, string value, bool fEncode)
18        {
19            if (name == "action")
20            {
21                HttpContext context = HttpContext.Current;
22 
23                value = context.Request.RawUrl;
24            }
25             base.WriteAttribute(name, value, fEncode);
26        }
27    }

这段代码是来自Jeffery Zhao的博客文章(我去掉了其中一些代码,只保留了保证会工作的最基本代码)。

需要说明的一点是:HtmlTextWriter有两个WriteAttribute方法:

public virtual void WriteAttribute(string name, string value, bool fEncode)

public virtual void WriteAttribute(string name, string value)

 

重写下面的那个WriteAttribute是不能成功的,必须重写上面那个方法。为什么呢?先调试看看。

会发现如果重写的是上面那个方法,则会有一次传进来的name值是"action",如我所愿,而重写下面那个方法则没发现传进来值是”action”的name参数。这是怎么搞的?

首先我们要知道,下面那个方法其实是简单的调用了上面的WriteAttribute :

public virtual void WriteAttribute(string name, string value) {

      WriteAttribute(name, value, false /*encode*/);

}

这是framework中的源码。那么,我们所可以猜测到的,就是action这个属性不是通过调用WriteAttribute(“action”, “…”)来渲染的,而是直接调用WrtiteAttribute(“action”, “…”, …),那我们就打开HtmlForm的源代码看看吧(没有源代码的可以用Reflector看),找到HtmlForm.RenderAttributes(HtmlTextWrtier writer)方法,其中有几行:

writer.WriteAttribute("method", Method);



Attributes.Remove("method");

// Encode the action attribute - ASURT 66784

writer.WriteAttribute("action", GetActionAttribute(), true /*encode*/);



Attributes.Remove("action");

我们重点看的是上面加粗并下划线的那两行,可以很清楚的看到,当渲染”method”属性时,只是调用了

public virtual void WriteAttribute(string name, string value)

而渲染action属性则是调用了

public virtual void WriteAttribute(string name, string value, bool fEncode)

那么,答案也就浮出水面了。

接下来,我们要让这个Adapter起作用(上面之所以可以调试,是因为我已经让其起作用了,只是还没写出来)。添加Asp.net Folder:App_Browses,新建一个browser文件:

<browsers>

    <browser refID="Default">

      <controlAdapters>

        <adapter controlType="System.Web.UI.HtmlControls.HtmlForm"

                 adapterType="FormRewriterControlAdapter"/>

      </controlAdapters>

    </browser>

</browsers>

因为上面的FormRewriterControlAdapter是写在App_Code中的,所以不需要添加命名空间。

上面说的是一种防止postback后地址还原的办法,还有一种办法就是利用UrlRewriter自带的form控件,这个方法还不需要写这么多代码:

首先,要先注册控件:

<%@ Register Namespace="Intelligencia.UrlRewriter" Assembly="Intelligencia.UrlRewriter" TagPrefix="rewriter" %>

然后用<rewriter:form runat="server"></form>代替掉原来的<form runat="server"></form>就可以了。

这么一来,使用UrlRewriter进行asp.net级别的UrlRewrite就弄好了。

from:http://www.cnblogs.com/mouhong-lin/archive/2008/08/07/1262965.html

欢迎加群互相学习,共同进步。QQ群:iOS: 58099570 | Android: 330987132 | Go:217696290 | Python:336880185 | 做人要厚道,转载请注明出处!http://www.cnblogs.com/sunshine-anycall/archive/2009/08/05/1539979.html

时间: 2024-10-12 05:25:02

使用UrlRewriter进行Url重写的完整解决方案[转]的相关文章

用(URLReWriter) url重写 在本地没有问题,但上传到虚拟服务器上出下面错误,是什么问题

问题描述 ServerErrorin'/'Application.--------------------------------------------------------------------------------SecurityExceptionDescription:Theapplicationattemptedtoperformanoperationnotallowedbythesecuritypolicy.Tograntthisapplicationtherequiredpe

asp.net URL重写(URLRewriter) 之简化版

asp.net 在 asp.net 里实现 URL重写(URLRewriter)的一个最简单的方法. 参考了 (作者 Scott Mitchell 翻译:Janssen )的大作,虽然没有完全看明白,但是也照猫画虎地做了一个,颇有"成就"感.写出来分享一下. 原作里讲了很多的原理,这里就不说了(其实我也不懂).这里就写操作过程吧.目的是实现一个最简单的能实现 URL重写 的程序. 1.需要设置一下IIS里的站点属性. 2.修改web.config的内容.  <system.web

asp.net URL重写简化版 速学URL重写_实用技巧

在 asp.net 里实现 URL重写(URLRewriter)的一个最简单的方法. 参考了 (作者 Scott Mitchell 翻译:Janssen )的大作,虽然没有完全看明白,但是也照猫画虎地做了一个,颇有"成就"感.写出来分享一下. 原作里讲了很多的原理,这里就不说了(其实我也不懂).这里就写操作过程吧.目的是实现一个最简单的能实现 URL重写 的程序. 1.需要设置一下IIS里的站点属性. 2.修改web.config的内容. 复制代码 代码如下: <system.w

url重写问题,希望高手来

问题描述 比如说,WWW.XXX.COM/A/A.ASPX?ID=1改成WWW.XXX.COM/A/?ID=1希望高手帮帮忙,先谢过了 解决方案 解决方案二:urlwriter.dll解决方案三:在WEB.CONFIG里怎么配置呢解决方案四:<system.web><urlMappings><addurl="~/default.aspx"mappedUrl="~/default00000.asp"/></urlMapping

asp.net用url重写URLReWriter实现任意二级域名 高级篇_实用技巧

 我最近写了个小例子,大家可以先看这个,里面有小例子的完整代码下载 http://www.jb51.net/article/20906.htm 好久没有写技术文章,如果大家看不明白,就多看几篇,汗,或者,在文章的后面回复(这是最有效的办法),我会尽力帮助大家解答疑惑. 来找这篇文章的,应该都知道什么叫二级域名吧,废话就不说了.但是讨论前,先要明白一个思想问题.很多朋友一直考虑不清(我前几天也一直搞不明白)的问题是,我键入一个地址后,怎么这个url就被重写了?第一步:在浏览器键入了一个地址,比如h

一个完整的ASP.NET 2.0 URL重写方案[翻译]_实用技巧

这篇文章描述了一个完整的 ASP.NET 2.0 URL 重写方案.这个方案使用正则表达式来定义重写规则并解决通过虚拟 URLs 访问页面产生回发事件的一些可能的困难. 为什么要重写 URL ? 将 URL 重写方法应用到你的 ASP.Net 应用程序的两个主要原因是:可用性和可维护性. 可用性 谁都知道,相对于难于辨认的带参数的长的查询路径,用户更喜欢一些短的.简洁的 URL.任何时候,一个容易记住和敲入的路径比添加到收藏夹更有用.其次,当一个浏览器的收藏夹不可用时,记住的地址总比在搜索引擎中

asp.net URL重写(URLRewriter) 简化版

在 asp.net 里实现 URL重写(URLRewriter)的一个最简单的方法. 参考了 (作者 Scott Mitchell 翻译:Janssen )的大作,虽然没有完全看明白,但是也照猫画虎地做了一个,颇有"成就"感.写出来分享一下. 原作里讲了很多的原理,这里就不说了(其实我也不懂).这里就写操作过程吧.目的是实现一个最简单的能实现 URL重写 的程序. 1.需要设置一下IIS里的站点属性. 2.修改web.config的内容.   <system.web>  &

asp.net URL重写(URLRewriter)之简化版

在 asp.net 里实现 URL重写(URLRewriter)的一个最简单的方法. 参考了 (作者 Scott Mitchell 翻译:Janssen )的大作,虽然没有完全看明白,但是也照猫画虎地做了一个,颇有"成就"感.写出来分享一下. 原作里讲了很多的原理,这里就不说了(其实我也不懂).这里就写操作过程吧.目的是实现一个最简单的能实现 URL重写 的程序. 1.需要设置一下IIS里的站点属性. 2.修改web.config的内容. <system.web> <

asp.net用url重写URLReWriter实现任意二级域名 新_实用技巧

一般用百度搜的朋友都是对这个不了解但又急需要用的,我想,再多的语言也比不过一句代码.于是我把今天帮朋友时候写的一个小例子传了上来.这个小例子的目的是实现对任意url的重写(但不包括二级域名的,有需要二级域名的也可以先了解下url重写的概念). 这个小项目的制作过程如下 1.需要对诸如http://jb51.net/viewnews/2009/3/2.html的url进行重写.将其重写为http://jb51.net/viewnews.aspx?id=2&year=2009&month=3