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>
/// 页面基类
/// </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!

有关于URL的重写,本文也只是拿来主意。相继有MS的组件“URLRewriter”和在Global.asax里的“Application_BeginRequest()”编码方式,以及IIS里的ISAPI设置。

娜列下来,实现方法也都很简单。

 

方法一:MS组件

这里也不用详解了,相关请看:

http://www.microsoft.com/china/msdn/library/webservices/asp.net/URLRewriting.mspx

用法很简单,只需要把组件URLRewriter.dll拷到应用程序的bin目录下,然后在web.config下加入如下代码:

<configuration></configuration>中加入:

    

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

                   
<LookFor>~/(\d{4})/(\d{2})/Default\.aspx</LookFor>

                   
<SendTo>~/Default.aspx?ID=$1</SendTo>

              
</RewriterRule>

          
</Rules>

     
</RewriterConfig>

 

然后在<system.web></system.web>中加入:

 

 

<httpHandlers>

   
<add verb="*" path="*.aspx" 

        type
="URLRewriter.RewriterFactoryHandler, URLRewriter" />

</httpHandlers>

 

最后在地址栏上键入:http://localhost/Test/2004/12/News.aspx

效果出来了。

上面的<LookFor>~/(\d{4})/(\d{2})/News\.aspx</LookFor>这句这正则表达式URL,即被重写的URL,而<SendTo>~/Default.aspx?ID=$1</SendTo>这一句为原始URL地址。其中的$1为第一个正则表达式值(上面例子为:2004),以此类推,第二个即为$2 

 

方法二:Application_BeginRequest()

在应用程序中新建一个XML文件,文件内容为:文件名ReWriter.config

<?xml version="1.0" encoding="utf-8" ?> 

<ReWriterUrls>

     
<rule>

          
<old>(.*)/News/(\d{4})/Default\.aspx</old>

          
<new>../../Default.aspx?id=$2&amp;type=$3</new>

     
</rule>

</ReWriterUrls>

Global.asax文件中的Application_BeginRequest(Object sender, EventArgs e)加入代码:

      

        try

              {

                   string path=Server.MapPath("~/ReWriter.config");

                   XPathDocument myXPathDocument = new XPathDocument(path);

                   XPathNavigator myXPathNavigator = myXPathDocument.CreateNavigator();

                   XPathNodeIterator myXPathNodeIterator = myXPathNavigator.Select ("//rule");

                   System.Text.RegularExpressions.Regex oReg;

                   string ReWriteUrl;

                   while (myXPathNodeIterator.MoveNext())

                   {

                        //oReg=new Regex(oNode.SelectSingleNode("url/text()").Value);

                        XPathNavigator nav2 = myXPathNodeIterator.Current.Clone();

                       string oldString="",newString="";

                        XPathNodeIterator it2 = nav2.Select("old");

                        while(it2.MoveNext())

                       {

                            oldString = it2.Current.Value;

                            break;

                       }

                       it2 = nav2.Select("new");

                        while(it2.MoveNext())

                       {

                            newString = it2.Current.Value;

                            break;

                       }

                        if(oldString != "" && newString != "")

                       {

                            oReg = new System.Text.RegularExpressions.Regex(oldString);

                            if(oReg.IsMatch(Request.Url.ToString()))

                            {

                                 ReWriteUrl = oReg.Replace(Request.Url.ToString(),newString);

                                 HttpContext.Current.RewritePath(ReWriteUrl);

                                 break;

                            }

                       }

                   }

              }

              catch

              {

              }

 

最后在地址栏上键入:http://localhost/Test/News/2004/Default.aspx

效果出来了。
转载自:http://www.cnblogs.com/hd/archive/2005/06/20/177633.html


posted on 2007-03-07 20:47  mbskys  阅读(159)  评论(0)    收藏  举报