当前位置:编程学习 > asp >>

net网站开发URLRewrite

一、URL Rewrite

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

比如浏览器发来请求51biancheng.com/101.aspx ,服务器自动将这个请求中定向为http://51biancheng.com/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&page=$2" />
</rewriter>需要注意的是,当使用多个参数时,需要使用HTML转义字符来代替&符号,也可以用cdata。

三、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作为链接。

另外对于一些很固定的映射,个人认为采用urlmapping也是个不错的选择,比如网站中的关于我们之类,你把aboutus.aspx?id=2映射为ourhistory.aspx需要在<system.web>节点下添加<urlMappings enabled=”true”><add url=”~/ourhistory.aspx” mappedUrl=”~/AboutUs.aspx?id=2″/></urlMappings>这是.net内置的支持省事而且高效。

 

补充:Web开发 , ASP.Net ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,