ASP.NET URL Rewrite. URL重写

来源:互联网 发布:c语言音乐代码 编辑:程序博客网 时间:2024/04/30 02:20

ASP.NET URL Rewrite. URL重写
URL 重写是截取传入 Web 请求并自动将请求重定向到其他 URL 的过程。
    比如浏览器发来请求hostname/101.aspx ,服务器自动将这个请求中定向为
http://hostname/list.aspx?id=101

url重写的优点在于:
      缩短url,隐藏实际路径提高安全性
      易于用户记忆和键入。
      易于被搜索引擎收录

二 实现url重写的基本方法
     下载MS的URLRewriter.dll,放到你的web程序的bin下
下载地址1:
http://www.rickel.cn/uploads/DevTools/MSDNURLRewriting.msi
下载地址2:download.microsoft.com/download/0/4/6/0463611e-a3f9-490d-a08c-877a83b797cf/MSDNURLRewriting.msi

下载完成后,在web.config里设置如下:


<?xml version="1.0" encoding="utf-8" ?>
<!--overred-->
<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>
     </system.web>
</configuration>

其中

<section name="RewriterConfig" type="URLRewriter.Config.RewriterConfigSerializerSectionHandler, URLRewriter" />


用于指定配置节"RewriterConfig"的处理程序类的名称为”URLRewriter.Config.RewriterConfigSerializerSectionHandler”,该类存在于bin目录下的URLRewriter .dll文件中

关键的是这两句

<LookFor>~/d(/d+)/.aspx</LookFor>
<SendTo>~/default.aspx?id=$1</SendTo>

<LookFor>~/d(/d+)/.aspx</LookFor>
表示,用户输入的url,d(/d+)/.aspx是 url中文件名匹配的正则表达式(此处为字母d开头,后面跟一个或多个数字,并以.aspx结尾。用户也可根据自己的需要自行设定)。

<SendTo>~/default.aspx?id=$1</SendTo>
,表示当服务器接收到符合上面条件的请求后如何重写url。此处表示访问defalutl.aspx并传入参数id,其值$1将用用户请求的文件名中的第一个数字来表示。
例如用户输入 hostname/d11.aspx,服务器会把他重写为
http://hostname/default.aspx?id=11。换句话说用户输入http: //hostname/d11.aspx,实际访问的是http://hostname/default.aspx?id=11。这样就起到了隐藏真实文件名,并便于用户记忆的作用。

处理回发
在重写后的url里如果产生回发,例如有一个按钮,又调用了该被重写的aspx,用户浏览器中将会显示该aspx文件实际的地址,也就是http: //hostname/default.aspx?id=11。但从用户的角度考虑,如 果单击按钮时突然看到 URL 更改会使他们感到不安。因此必须解决这个问题。
解决方法有二:
(1)自己定义一个Actionlessform类,在aspx中不再使用系统提供的form 标记


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);
           }
      }
}


创建此类并对其进行编译之后,要在 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>

个人并不推荐该方法
(2)第二种方法就是继承page,这样你不需要在aspx页中改任何东西。
代码:

using System;
using System.IO;
using System.Web;
using System.Web.UI;
namespace URL
{
      public class OLPage : Page
      {
          public OLPage()
          {}
          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)
      {
          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,并在你的项目中引用它。

然后把项目中的所有aspx文件对应的cs文件中的继承page类的代码改写为继承OLPage。
例如

public class WebForm1:page

改写为

public class WebForm1:URL.OLPage


这样就解决回发问题。

 

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 我来贷放款中不到账怎么办 手持身份证被别人网贷了怎么办 身份证被别人做了网贷怎么办 身份证丢了被别人网贷了怎么办 户口身份证被注销了网贷怎么办 首付交了贷款办不下来怎么办 付首付后贷款没有批下来怎么办 交了首付贷款没有办下来怎么办 买房交了首付贷款没批下来怎么办 交完首付办不下来贷款怎么办 房子交了首付贷款办不下来怎么办 浦发银行办理房贷流水不够怎么办 房贷审批过程中突然换工作怎么办 建行快贷结清后无额度怎么办 建设银行快贷逾期2个月怎么办 全职速卖通一个月没订单要怎么办 买家点的好评写的差评怎么办 手机流量把话费扣没了怎么办 街电忘记还怎么办3天了 街电1个星期没还怎么办 苹果手机设置密码忘记问题了怎么办 买房付了首付后无法办按揭怎么办 苹果x导入通讯录不显示名字怎么办 苹果切换了id通讯录没有了怎么办 换了id通讯录记录没有了怎么办 4s升级系统通讯录没了怎么办 手机接听声音小怎么办但插耳机正常 苹果6p手机听筒声音小怎么办 苹果6s接电话对方声音小怎么办 iphone死机了怎么办关机也关不了 苹果7p卡死sos了怎么办 苹果x死机且屏幕失灵怎怎么办 幸果手机开机数字便按不动了怎么办 苹果6s黑屏但没关机怎么办 苹果6p突然黑屏怎么办单冷接电话 华硕86u的5g掉线找不到怎么办 信而富额度被清0怎么办 贷款回访电话回答错两个问题怎么办 天天中彩票获取期号失败怎么办 借贷宝电话打到家里了怎么办 私人借款付了利息不下款怎么办