【IHttpHandler】在ASP.Net2.0中使用UrlRewritingNet实现链接重写

很多时候我们需要链接转向(Url Rewriting),例如二级域名转向、文章访问链接等场合。
让我们看两个例子:
1 你现在看到的当前作者的博客园的域名:
http://jx270.cnblogs.com/ 实际上是 http://www.cnblogs.com/jx270 的一种链接重写(Url Rewriting)。
2 codeproject上的文章,我们获取的地址都是以文章主要关键字做的网页名称:
http://www.codeproject.com/cs/webservices/wsdlparser.asp 
个人觉得实际的文章链接可能是如下格式(纯属猜想)
http://www.codeproject.com/news.asp?id=123456  
那么如何在Asp.net2.0中如何实现链接重写呢?
可以采用UrlRewritingNet.UrlRewriter.dll来轻松实现
UrlRewritingNet.UrlRewriter.dll 可从其官方网站下载:http://www.urlrewriting.net
我们要做的就是进行Web.Config文件的设置

0 设置之前需要添加引用:UrlRewritingNet.UrlRewriter.dll

1 <configSections>间添加:
  <configSections>
  <section name="urlrewritingnet" restartOnExternalChanges="true" requirePermission="false" type="UrlRewritingNet.Configuration.UrlRewriteSection, UrlRewritingNet.UrlRewriter"/>
</configSections>

2   添加httpModules
<httpModules>
      <add name="UrlRewriteModule" type="UrlRewritingNet.Web.UrlRewriteModule, UrlRewritingNet.UrlRewriter"/>
  </httpModules>


3 添加链接重写的设置
<urlrewritingnet rewriteOnlyVirtualUrls="true" contextItemsPrefix="QueryString" defaultPage="default.aspx" defaultProvider="RegEx" xmlns="http://www.urlrewriting.net/schemas/config/2006/07">
  <rewrites>
   <add name="Rewrite1" virtualUrl="^http\://(.*)/UrlRewritingTest/test.aspx" rewriteUrlParameter="ExcludeFromClientQueryString" destinationUrl="~/default.aspx" rewrite="Domain" ignoreCase="true"/>
   <add name="Rewrite2" virtualUrl="^http\://(.*)/UrlRewritingTest/test1.aspx" rewriteUrlParameter="ExcludeFromClientQueryString" destinationUrl="~/info.aspx?year=2007&amp;month=3&amp;day=9" rewrite="Domain" ignoreCase="true"/>
  </rewrites>
</urlrewritingnet>

完整的一个Web.Config文件

<?xml version="1.0"?>
<configuration>
    <configSections>
        <section name="urlrewritingnet" restartOnExternalChanges="true" requirePermission="false" type="UrlRewritingNet.Configuration.UrlRewriteSection, UrlRewritingNet.UrlRewriter"/>
    </configSections>
    <urlrewritingnet rewriteOnlyVirtualUrls="true" contextItemsPrefix="QueryString" defaultPage="default.aspx" defaultProvider="RegEx" xmlns="http://www.urlrewriting.net/schemas/config/2006/07">
        <rewrites>
            <add name="Rewrite1" virtualUrl="^http\://(.*)/UrlRewritingTest/test.aspx" rewriteUrlParameter="ExcludeFromClientQueryString" destinationUrl="~/default.aspx" rewrite="Domain" ignoreCase="true"/>
            <add name="Rewrite2" virtualUrl="^http\://(.*)/UrlRewritingTest/test1.aspx" rewriteUrlParameter="ExcludeFromClientQueryString" destinationUrl="~/info.aspx?year=2007&amp;month=3&amp;day=9" rewrite="Domain" ignoreCase="true"/>
            <add name="Rewrite3" virtualUrl="^http\://(.*)/UrlRewritingTest/test(\d{4})(\d{2})(\d{2}).aspx" rewriteUrlParameter="ExcludeFromClientQueryString" destinationUrl="~/info.aspx?year=$2&amp;month=$3&amp;day=$4" rewrite="Domain" ignoreCase="true"/>
            <add name="Rewrite4" virtualUrl="^http\://(.*)/UrlRewritingTest/(\d{4})/(\d{2})/(\d{2})/info.aspx" rewriteUrlParameter="ExcludeFromClientQueryString" destinationUrl="~/info.aspx?year=$2&amp;month=$3&amp;day=$4" rewrite="Domain" ignoreCase="true"/>
      <add name="Rewrite5" virtualUrl="^http\://(.*)/UrlRewritingTest/stock(\d{6}).aspx" rewriteUrlParameter="ExcludeFromClientQueryString" destinationUrl="~/stockinfo.aspx?code=$2" rewrite="Domain" ignoreCase="true"/>
        </rewrites>
    </urlrewritingnet>
    <appSettings/>
    <system.web>
        <httpModules>
            <add name="UrlRewriteModule" type="UrlRewritingNet.Web.UrlRewriteModule, UrlRewritingNet.UrlRewriter"/>
        </httpModules>
        <compilation debug="true"/>
  </system.web>
</configuration>

示例程序
我们做了一个按查询字符串的输入显示对应日期的页面info.aspx

    protected void Page_Load(object sender, EventArgs e)
    {
        string strYear = Request.QueryString["year"].ToString();
        string strMonth = Request.QueryString["month"].ToString();
        string strDay = Request.QueryString["day"].ToString();
        Response.Write(string.Format("你输入的日期是{0}年{1}月{2}日",strYear,strMonth,strDay));
    }

常规访问方式:http://localhost/UrlRewritingTest/info.aspx?year=2007&month=03&day=08

页面重写方式1:http://localhost/UrlRewritingTest/test20070308.aspx
页面重写方式2:http://localhost/UrlRewritingTest/2007/03/08/info.aspx
大家可以看到实际的访问效果是一致的。

示例文件中还有一个股票信息查看的例子:
http://localhost/UrlRewritingTest/stock600616.aspx = http://localhost/UrlRewritingTest/stockinfo.aspx?code=600616

示例程序下载:/Files/heekui/UrlRewritingTest.rar

时间: 2025-01-31 06:43:42

【IHttpHandler】在ASP.Net2.0中使用UrlRewritingNet实现链接重写的相关文章

asp.Net2.0中TextBox设置只读后后台获取不到值的解决方法

http://www.cnblogs.com/yxyht/archive/2013/03/02/2939883.html ASP.NET中TextBox控件设置ReadOnly="true"H或Enabled=false后台取不到值 当TextBox设置了ReadOnly="true" 后,要是在前台为控件添加了值,后台是取不到的,值为“空”  . 方法一:不设置ReadOnly属性,通过onfocus=this.blur()来模拟,如下: <asp:Text

asp.net2.0安全性(3)--验证与授权--转载来自车老师

"验证"与"授权"是对网页资源安全管理的两道门. 验证(Authentication):检查用户是否是合法的用户.就像是网站大门口的保卫,服责验证使用的用户名和密码. 授权(Authorization):检查用户是否有访问某种资源的权限.例如有的人虽然能过了环保局门口保卫的验证,进入环保局,但他可能是一个普通科员,那他就没有局长职责. 验证与授权的底层运作: 首先,打开windows操作系统的“管理工具”->“计算机管理”->“本地用户和组”->“

asp.net2.0安全性(1)--用户角色篇(类)--转载来自车老师

Membership.MembershipUser和Roles类 用户与角色管理在asp.net2.0中是通过Membership和Roles两个类来实现的. Membership:用户成员账号管理,用户名.密码.邮箱等 Roles:负责用户和群组之间关系管理. l         Membership类: 主要是创建用户帐号.验证用户身份和管理用户设置 属性: 1)        EnablePasswordReset:获取一个值,以指示是否可以重置密码. 2)        EnablePa

asp.net2.0安全性(1)--用户角色篇(起篇)--转载来自车老师

安全管理的解决方案在.net1.1中几乎为一片空白,对于应用程序的验证与授权大部分的工作是开发人员自己编写代码,或者是借助企业库等工具来实现,此可谓.net1.1中的一大缺憾.在.net2.0中微软为我们提供了一系列的API类和控件,大大简化了我们在此方面的工作量. 下面我将推出一系列的随笔介绍asp.net2.0的安全系统. Asp.net2.0中提供了一系列的控件实现验证与授权中的各种功能,这些控件我将在以后讲述.但喜欢思考的朋友们可能会问:这些控件是怎样实现了这一系列的功能呢?答案是:通过

asp.net2.0安全性(2)--用户个性化设置(1)--转载来自车老师

在Membership表中可以存储一些用户的基本信息,但有的时候,我们需要记录的用户信息远远不止Membership表中提供的这些,如QQ.MSN.家庭住址.联系电话等等.那如何把这些用户信息记录到数据库中呢?在asp.net2.0中为我们提供了个性设置的功能――Profile.下面看一下Profile的几个特征: 1)        Profile根据每个用户存储各自的用户资料,包括匿名称用的资料. 2)        Profile可以在Web.Config中定义而立即生效,不必手动扩充数据

asp.net2.0安全性(2)--用户个性化设置(2)--转载来自车老师

上一篇我们用Profile.age等方式可以读取用户的年龄和其它的信息,但有的时候我们要查询显示所有用户的信息,但asp.net没有提供查询所有用户信息的功能,我们只能对现有的用户逐一查询其Profile信息. 第一步:设置配置文件 第二步:得到所有的用户 MembershipUserCollection users = Membership.GetAllUsers(); 这里用到了Membership类的GetAllUsers()方法,此内容已经在“用户与角色管理”中说过,不再赘述. 第三步:

在ASP.NET2.0里打印网页指定的内容(比如打印网页里的一个Table)

原文:在ASP.NET2.0里打印网页指定的内容(比如打印网页里的一个Table) 打印指定内容: <html> <head> <script   type= "text/javascript "   language= "javascript "> function   printPage()   {   var   newWin   =   window.open( 'about:blank ', ' ', ' ');   v

ASP.NET2.0 ObjectDataSource的使用详解《转》

原文发布时间为:2008-08-02 -- 来源于本人的百度文章 [由搬家工具导入] ASP.NET2.0 ObjectDataSource的使用详解(2) http://mqingqing123.cnblogs.com/archive/2006/04/20/379720.html           这是因为GridView 和其他数据绑定控件调用 Update 操作的自动功能需依赖此命名约定才能工作。参数的命名预期应与 SelectCommand 返回的关联字段值相同。使用此命名约定使得数据

.net2.0中的Json序列化数据

在.net3.0中序列化数据只需引用System.Web.Extensions.dll, 命名空间里引用了System.Web.Script.Serialization JavaScriptSerializer jss = new JavaScriptSerializer(); jss.Serialize(list);即可!! 但在2.0中没有System.Web.Extensions.dll,所以不能像在3.0里那样用了,我的方法是换一个序列化类,Json.Net支持.net 2.0,进入点击