zoukankan      html  css  js  c++  java
  • ASP.NET中的URLRewrite

      一、URL Rewrite

    URL Rewrite是截取传入Web 请求并自动将请求重定向到其他URL的过程。

    比如浏览器发来请求hostname/101.aspx ,服务器自动将这个请求中定向为http://hostname/list.aspx?id=101

    URL Rewrite的优点在于:

    1. 缩短URL,隐藏实际路径提高安全性
    2. 易于用户记忆和键入
    3. 易于被搜索引擎收录

    有很多种手段实现URL Rewrite,我选择了我认为最好的一种。这种方法的优点在于,不需要更改任何与IIS有关的设定,而且在中等信任安全等级的虚拟主机中,也可以使用。

    二、实现细节

    1. 准备URLRewrite.NET的类库,将网站引用这个类库;

    2. 将configSections加入到configuration的第一节:

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

    3. 将对httpModule的处理加入到system.web中:

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

    4. 在configuration中,加入对rewrite的设定:

    <rewriter>
    <rewrite url="~/Articles/(\d+)" to="~/Articles/Detail.aspx?id=$1" />
    <rewrite url="~/Categories/(\d+)" to="~/Articles/List.aspx?id=$1" />
    <rewrite url="~/Categories/(\d+)_(\d+)" to="~/Articles/List.aspx?id=$1&amp;page=$2" />
    </rewriter>

    需要注意的是,当使用多个参数时,需要使用HTML转义字符来代替&符号。

    三、IIS配置

    在IIS 7中,URLRewriter.NET可以不经配置正常使用,但是在IIS 6中,需要进行一些配置,详见以下链接。

    http://urlrewriter.net/index.php/support/installation/windows-server-2003

    四、ASP.NET的Postback设定

    由于在使用了UrlRewriter后,ASP.NET中的Postback机制导致页面发生回送后,会在浏览器中使用其原始链接,容易使用户发生困惑,也不利于搜索引擎的检索,故需要加以处理。

    在ASP.NET 2.0后,我们可以通过使用控件适配器的扩展框架来定制重写<form>的action属性,而不需要对页面代码做出任何改动。

    1. 在App_Code中,加入FormRewriter.cs文件:

    using System.Web;
    using System.Web.UI;

    public class FormRewriterControlAdapter : System.Web.UI.Adapters.ControlAdapter
    {
    protected override void Render(HtmlTextWriter writer)
    {
    base.Render(new RewriteFormHtmlTextWriter(writer));
    }
    }

    public class RewriteFormHtmlTextWriter : HtmlTextWriter
    {
    public RewriteFormHtmlTextWriter(HtmlTextWriter writer)
    : base(writer)
    {
    InnerWriter = writer.InnerWriter;
    }

    public RewriteFormHtmlTextWriter(System.IO.TextWriter writer)
    : base(writer)
    {
    InnerWriter = writer;
    }

    public override void WriteAttribute(string name, string value, bool fEncode)
    {
    if ((name == "action"))
    {
    HttpContext Context = HttpContext.Current;
    if (Context.Items["ActionAlreadyWritten"] == null)
    {
    value = Context.Request.RawUrl;
    Context.Items["ActionAlreadyWritten"] = true;
    }
    }
    base.WriteAttribute(name, value, fEncode);
    }
    }

    2. 在App_Browsers中,加入Form.browser文件:

    <browsers>
    <browser refID="Default">
    <controlAdapters>
    <adapter controlType="System.Web.UI.HtmlControls.HtmlForm" adapterType="FormRewriterControlAdapter" />
    </controlAdapters>
    </browser>
    </browsers>

    这样处理后,就可以保证页面在发生Postback后,仍然使用原来的URL作为链接。

    转自:http://kb.vigal.net/asp-net-url-rewrite/

    作者:KKcat
        
    个人博客:http://jinzhao.me/
        
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    js封装日期格式化函数
    原生js时间戳获取和转换
    自适应好用的一个css
    ES6五种遍历对象属性的方式
    ES6对象属性名简洁表示法和表达式、对象新方法、属性的遍历
    ES6数组扩展运算符(Rest+Spread)、类方法、原型方法
    正则表达式常见匹配
    typescript深copy和浅copy
    判断一个变量类型是对象还是数组
    npm 淘宝镜像的配置
  • 原文地址:https://www.cnblogs.com/jinzhao/p/1649200.html
Copyright © 2011-2022 走看看