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

转载于:https://www.cnblogs.com/chenying99/archive/2011/03/14/1983131.html

ASP.NET URL Rewrite. URL重写相关推荐

  1. asp.net mvc、asp.net url重写 Url Rewrite

    最近在做一个cms手机网站,由于内容不是很多,很快做完了.空闲的时间考虑seo,想把url全部写成静态的.在查资料的时候,发现 UrlRewrite.Net这个组件非常的不错,尝试了下结果达到了理想的 ...

  2. 在 ASP.NET 中执行 URL 重写

    在 ASP.NET 中执行 URL 重写 发布日期: 8/23/2004 | 更新日期: 8/23/2004 Scott Mitchell 4GuysFromRolla.com 适用范围: Micro ...

  3. 在ASP.NET MVC中使用IIS级别的URL Rewrite

    在ASP.NET MVC中使用IIS级别的URL Rewrite 原文 在ASP.NET MVC中使用IIS级别的URL Rewrite 大约一年半前,我在博客上写过一系列关于URL Rewrite的 ...

  4. Url Rewrite 再说Url 重写

    前几天看到园子里一篇关于 Url 重写的文章<获取ISAPI_Rewrite重写后的URL> , URL-Rewrite 这项技术早已不是一项新技术了,这个话题也已经被很多人讨论过多次.搜 ...

  5. ASP.NET Core URL Rewrite中间件

    URL重写是基于一个或多个预置规则修改请求URL的行为.URL重写在资源位置和访问地址之间创建了一种抽象,这样二者之间就减少了紧密的联系.URL重写有多种适用的场景: 临时或永久移动或替换服务器资源, ...

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

    在ASP.NET中,如果你使用了URL重写,通过HttpContext.Request获取到的是重写后的地址.如果这个地址要返回给客户端(比如Redirect),我们一般希望是重写前的友好地址. 通常 ...

  7. IIS安装和使用URL重写工具-URL Rewrite

    下载和安装URL Rewrite IIS8默认是没有安装URL重写工具的,必须要自己下载安装. 如果IIS上默认有安装Web平台安装程序,我们可以使用平台自动安装URL Rewrite重写工具,打开I ...

  8. IIS Url Rewrite重写不生效

    我有两台Server做集群,有一个虚拟目录站点使用了一个第三方插件,但这个插件不支持集群,负载均衡后会导致这个插件报错,所以需要将其中一台Server的虚拟目录的应用反向代理到另一台. 当然用Ngin ...

  9. 艾伟:重提URL Rewrite(3):在URL Rewrite后保持PostBack地址

    在进行了URL Rewrite之后,经常会遇到的问题就是页面中PostBack的目标地址并非客户端请求的地址,而是URL Rewrite之后的地址.以上一篇文章中的重写为例: <rewriter ...

最新文章

  1. 爬一爬那些年你硬盘存过的“老师”
  2. 使用bottle进行web开发:get的参数传递,form数据传递等
  3. php manual 反射,Laravel框架源码解析之反射的使用详解
  4. 20050708:我还是忍忍吧
  5. swift学习选pizza项目
  6. xwpftablecell设置字体样式_HTML的文字样式
  7. python设计模式23-访问者模式
  8. usb 键盘码表_键盘鼠标对应码表-delphi键值
  9. python从入门到精通pdf百度云-跟老齐学Python:从入门到精通 完整版PDF[7MB]
  10. python怎么读取中文文件-Python3 中文文件读写方法
  11. OJ-1:时钟问题【九度1553】
  12. php while次数,PHP While 循环
  13. cnc计算机控制,CNC控制器
  14. 解决windows 7双网卡分别接内外网冲突
  15. wordpress企业网站主题
  16. OSChina 周五乱弹 ——什么样的工作每天都有艳遇
  17. USYD悉尼大学DATA 2002 【Module 1】: Categorical data 学习笔记(week1-week3)
  18. CSS动画,风车案例
  19. git Bash 命令行大全
  20. pcs增加mysql资源_pcs命令配置示例(详细版)

热门文章

  1. 年关将至,很多朋友想要创业的心又开始蠢蠢欲动了
  2. 一个普通人,想改变命运,最靠谱的3种方式
  3. 满足ThreadLocal目的
  4. C++语言的技术性规则
  5. 删除排除链表中的重复元素
  6. 火狐浏览器使用copper插件无反应问题
  7. t–sql pl–sql_SQL Server处理器性能指标–第3部分–指示硬件组件问题的指标
  8. Excel将多个工作簿加载到SQL Server中
  9. sql concat函数_使用SQL Plus(+)和SQL CONCAT函数SQL Server CONCATENATE操作
  10. swagger在springboot上的快速上手