ASP.NET 中执行 URL 重写

asp.net|执行

  URL 重写就是把URL地址重新改写
  
  详情:http://www.microsoft.com/china/msdn/library/webservices/asp.net/URLRewriting.mspx
  
  优点:把url缩短等
  
  用法:1.下载ms的URLRewrite.dll,放到你的bin下
  
  2.在web.config里设置如下:
  
  <?xml version="1.0" encoding="utf-8" ?>
  <configuration>
  
  <configSections>
  
  <section name="RewriterConfig" type="URLRewriter.Config.RewriterConfigSerializerSectionHandler, URLRewriter" />
  
  </configSections>
  
  
  <RewriterConfig>
  
  <Rules>
  
  <RewriterRule>
  <LookFor>~/d(\d+)\.aspx</LookFor>
  <SendTo>~/default.aspx?id=$1</SendTo>
  </RewriterRule>
  
  </Rules>
  
  </RewriterConfig>
  
  <system.web>
  
  
  <httpHandlers>
  
  <add verb="*" path="*.aspx"
  
  type="URLRewriter.RewriterFactoryHandler, URLRewriter" />
  
  </httpHandlers>
  
  
  
  然后在cs里写:
  
  private void Page_Load(object sender, System.EventArgs e)
  {
  // 在此处放置用户代码以初始化页面
  Response.Write(Request.QueryString["id"]+"<BR>");
  Response.Write("haha");
  }
  
  只要输入
  
  localhost/overred/d123.aspx(注意:开头必须为d,后为数字)
  其实这个d123.aspx是虚拟的,并不是实际存在的。只要符合格式就行。
  
  他就会跳到http://localhost/overred/default.aspx
  
  而且他在default里可以捕捉一些参数比如id,就是你的d后的数字(后必须为数字),这样你就可以显示id为123的文章。
  
  在重写后的url里如果产生回发将会传递到d123.aspx,这样用户在点button时会看到哪个实际的地址,msdn上说的:但从用户的角度考虑,如果单击按钮时突然看到 URL 更改会使他们感到不安。
  
  可见ms把客户捧为他的上帝!(真的?#¥%……—*)
  
  继续引用ms:
  
  出现这种情况的原因是:在呈现 Web 窗体时,它会将其操作属性直接设置为 Request 对象中文件路径的值。当然,在呈现 Web 窗体时,URL 已从 /Products/Beverages.aspx 重写为 ListProductsByCategory.aspx?CategoryID=1,这表明 Request 对象报告用户要访问 ListProductsByCategory.aspx?CategoryID=1。只需使服务器端窗体不呈现操作属性即可解决此问题。(默认情况下,如果窗体不包含操作属性,浏览器将会回发。)
  
  不幸的是,Web 窗体不允许您明确指定操作属性,也不允许您设置某些属性以禁用操作属性的呈现。因此,我们必须自己来扩展 System.Web.HtmlControls.HtmlForm 类,覆盖 RenderAttribute() 方法并明确指出它不会呈现操作属性。
  
  由于继承功能,我们可以获得 HtmlForm 类的所有功能,并且只需添加几行代码即可获得所需的行为。以下显示了自定义类的完整代码:
  
  namespace ActionlessForm {
  public class Form : System.Web.UI.HtmlControls.HtmlForm
  {
  protected override void RenderAttributes(HtmlTextWriter writer)
  {
  writer.WriteAttribute("name", this.Name);
  base.Attributes.Remove("name");
  
  writer.WriteAttribute("method", this.Method);
  base.Attributes.Remove("method");
  
  this.Attributes.Render(writer);
  
  base.Attributes.Remove("action");
  
  if (base.ID != null)
  writer.WriteAttribute("id", base.ClientID);
  }
  }
  }
  
  已被覆盖的 RenderAttributes() 方法的代码仅包含 HtmlForm 类的 RenderAttributes() 方法的准确代码,而不设置操作属性。(我使用 Lutz Roeder 的 Reflector 来查看 HtmlForm 类的源代码。)
  
  创建此类并对其进行编译之后,要在 ASP.NET Web 应用程序中使用它,应首先将其添加到 Web 应用程序的 References 文件夹中。然后,要使用它来代替 HtmlForm 类,只需在 ASP.NET 网页的顶部添加以下内容即可:
  
  <%@ Register TagPrefix="skm" Namespace="ActionlessForm"
  Assembly="ActionlessForm" %>
  
  然后,将 <form runat="server">(如果有)替换为:
  
  <skm:Form id="Form1" method="post" runat="server">
  
  并将右边的 </form> 标记替换为:
  
  </skm:Form>
  
  以上的是继承个form,其实还有更简单的,就是继承page,这样你不需要在aspx页中改任何东西。
  代码:
  using System;
  using System.IO;
  using System.Web;
  using System.Web.UI;
  
  namespace URl
  {
  /**//// <summary>
  /// 页面基类www.knowsky.com
  /// </summary>
  public class OLPage : Page
  {
  public OLPage()
  {
  } 
      
  /**//// <summary>
  /// 重写默认的HtmlTextWriter方法,修改form标记中的value属性,使其值为重写的URL而不是真实URL。
  /// </summary>
  /// <param name="writer"></param>
  protected override void Render(HtmlTextWriter writer)
  {
  
  if (writer is System.Web.UI.Html32TextWriter)
  {
  writer = new FormFixerHtml32TextWriter(writer.InnerWriter);
  }
  else
  {
  writer = new FormFixerHtmlTextWriter(writer.InnerWriter);
  }
  
  base.Render(writer);
  } 
   
  } 
   
  internal class FormFixerHtml32TextWriter : System.Web.UI.Html32TextWriter
  {
  private string _url; // 假的URL
  
  internal FormFixerHtml32TextWriter(TextWriter writer):base(writer)
  {
  _url = HttpContext.Current.Request.RawUrl;
  }
  
  public override void WriteAttribute(string name, string value, bool encode)
  {
  // 如果当前输出的属性为form标记的action属性,则将其值替换为重写后的虚假URL
  if (_url != null && string.Compare(name, "action", true) == 0)
  {
  value = _url;
  }
  base.WriteAttribute(name, value, encode);
  }
  } 
   
  internal class FormFixerHtmlTextWriter : System.Web.UI.HtmlTextWriter
  {
  private string _url;
  internal FormFixerHtmlTextWriter(TextWriter writer):base(writer)
  {
  _url = HttpContext.Current.Request.RawUrl;
  }
  
  public override void WriteAttribute(string name, string value, bool encode)
  {
  if (_url != null && string.Compare(name, "action", true) == 0)
  {
  value = _url;
  }
  
  base.WriteAttribute(name, value, encode);
  }
  }
  
  }
  
  
  你把他封装成dll,以后只要添加引用就可以拉! 
   
  ok ,it is so easy!

时间: 2024-08-27 23:51:28

ASP.NET 中执行 URL 重写的相关文章

在 ASP.NET 中执行 URL 重写

asp.net|执行 Scott Mitchell 4GuysFromRolla.com 适用范围: Microsoft ASP.NET 摘要:介绍如何使用 Microsoft ASP.NET 执行动态 URL 重写.URL 重写是截取传入 Web 请求并自动将请求重定向到其他 URL 的过程.讨论实现 URL 重写的各种技术,并介绍执行 URL 重写的一些实际情况. 下载本文的源代码. 本页内容 引言 URL 重写的常见用法 请求到达 IIS 时将会发生什么情况 实现 URL 重写 构建 UR

在ASP.NET中执行URL重写经典方案

摘要:介绍如何使用 Microsoft ASP.NET 执行动态 URL 重写.URL 重写是截取传入 Web 请求并自动将请求重定向到其他 URL 的过程.讨论实现 URL 重写的各种技术,并介绍执行 URL 重写的一些实际情况. 引言 让我们花点时间来看一下网站上的一些 URL.您是否发现一些类似于 http://yoursite.com/info/dispEmployeeInfo.aspx?EmpID=459-099&type=summary 的 URL?或者,您可能将一系列网页从一个目录

ASP.NET中获取URL重写前的原始地址

在ASP.NET中,如果你使用了URL重写,通过HttpContext.Request获取到的是重写后的地址.如果这个地址要返回给客户端(比如Redirect),我们一般希望是重写前的友好地址. 通常的使用场景是当我们有某个页面需要用户登录才能访问时,我们会在代码中判断当前访问用户是否登录,如果未登录,则重定向至登录页面,并将当前网址通过Url参数传递给登录页面.如果使用了URL重写,并通过Request.Url.AbsoluteUri获取当前网址,用户登录后打开的就是重写后的地址,这虽然不影响

ASP.NET中获取URL重写前的原始地址详解

在ASP.NET中,如果你使用了URL重写,通过HttpContext.Request获取到的是重写后的地址.如果这个地址要返回给客户端(比如Redirect),我们一般希望是重写前的友好地址.   通常的使用场景是当我们有某个页面需要用户登录才能访问时,我们会在代码中判断当前访问用户是否登录,如果未登录,则重定向至登录页面,并将当 前网址通过Url参数传递给登录页面.如果使用了URL重写,并通过Request.Url.AbsoluteUri获取当前网址,用户登录后打开的就是 重写后的地址,这虽

ASP.NET中获取URL重写前的原始地址详解_实用技巧

通常的使用场景是当我们有某个页面需要用户登录才能访问时,我们会在代码中判断当前访问用户是否登录,如果未登录,则重定向至登录页面,并将当前网址通过Url参数传递给登录页面.如果使用了URL重写,并通过Request.Url.AbsoluteUri获取当前网址,用户登录后打开的就是重写后的地址,这虽然不影响正常使用,但从用户体验及URL统一的角度,我们更希望是重写前的地址. 之前,我们在开发中也被这个问题困扰,只能尽量通过js重定向至登录页面(通过location.href获取当前网址)或者在代码中

在ASP.NET中实现Url Rewriting

asp.net 概要 分析如何使用微软提供的ASP.NET来对动态产生的URL地址进行网址重写. 网址重写是实现一种截取网址请求并将其进行处理后重新指向到一个指定的网址的过程.作者本人在对各种实现网址重写的技术进行研究和探讨后得出的经验和方法,希望能对您有所帮助. 内容简介 稍微花点时间看一看你做的网站里头的URL地址,你看到类似这样的地址吗http://yoursite.com/info/dispEmployeeInfo.aspx?EmpID=459-099&type=summary ?也许你

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

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

asp.net中对URL的一些操作

编辑器加载中... 例如当前URI为:http://www.test.com/zzl/renren?id=1 获取绝对URI的路 System.Web.HttpContext.Current.Request.Url.AbsolutePath (/zzl/renren) 获取绝对URI System.Web.HttpContext.Current.Request.Url.AbsoluteUri (www.test.com/zzl/renren) 获取服务器的主机名或IP地址和端口号 System.

asp.net 2.0 中的URL重写以及urlMappings问题_实用技巧

在asp.net2.0中的urlMappings倒是非常好用,可惜暂不支持正则表达式,不过,好在如果用IHttpModule的话  不管什么样的请求都会先经过IHttpModule这样就为URL重写提供了一个好机会:  下面是我写的一个IHttpModule:  using System;  using System.Web;  public class ReWriteModule:IHttpModule  {  public ReWriteModule()  {  }  public over