url重写:URL 重写的实现方法



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

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

2实现url重写基本思路方法
下载MSURLRewriter.dll放到你webbin下
下载地址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里设置如下:
<?xmlversion=\"1.0\"encoding=\"utf-8\"?>
<!--overred-->
<configuration>
<configSections>
<sectionname=\"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>
<addverb=\"*\"path=\"*.aspx\"type=\"URLRewriter.RewriterFactoryHandler,URLRewriter\"/>
</httpHandlers>
</system.web>
</configuration>


其中
<sectionname=\"RewriterConfig\"type=\"URLRewriter.Config.RewriterConfigSerializerSectionHandler,URLRewriter\"/>

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

关键是这两句
<LookFor>~/d(\\d+)\\.aspx</LookFor>
<SendTo>~/default.aspx?id=$1</SendTo> [Page]

<LookFor>~/d(\\d+)\\.aspx</LookFor>表示用户输入urld(\\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更改会使他们感到不安因此必须解决这个问题
解决思路方法有 2:
(1)自己定义个Actionlessform类在aspx中不再使用系统提供form标记

ActionlessForm
{
publicForm:.Web.UI.HtmlControls.HtmlForm
{
protectedoverridevoidRenderAttributes(HtmlTextWriterwriter)
{
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\");
(base.ID!=null)
writer.WriteAttribute(\"id\",base.ClientID);


}
}
}

创建此类并对其进行编译的后要在ASP.NETWeb应用中使用它应首先将其添加到Web应用References文件夹中然后要使用它来代替HtmlForm类做法是在ASP.NET网页顶部添加以下内容: [Page]

<%@RegisterTagPrefix=\"skm\"Namespace=\"ActionlessForm\"Assembly=\"ActionlessForm\"%>
然后将<formrunat=\"server\">(如果有)替换为:<skm:Formid=\"Form1\"method=\"post\"runat=\"server\">
并将右边</form>标记替换为:</skm:Form>

个人并不推荐该思路方法
(2)第 2种思路方法就是继承page这样你不需要在aspx页中改任何东西
代码:
using;
using.IO;
using.Web;
using.Web.UI;
URL
{
publicOLPage:Page
{
publicOLPage
{}
protectedoverridevoidRender(HtmlTextWriterwriter)
{
(writeris.Web.UI.Html32TextWriter)
{
writer=FormFixerHtml32TextWriter(writer.InnerWriter);
}

{
writer=FormFixerHtmlTextWriter(writer.InnerWriter);
}
base.Render(writer);
}
}

ernalFormFixerHtml32TextWriter:.Web.UI.Html32TextWriter
{
private_url;//假URL

ernalFormFixerHtml32TextWriter(TextWriterwriter):base(writer)
{
_url=HttpContext.Current.Request.RawUrl;
}

publicoverridevoidWriteAttribute(name,value,boolencode) [Page]
{
(_url!=null&&.Compare(name,\"action\",true)0)
{
value=_url;
}
base.WriteAttribute(name,value,encode);

}
}

ernalFormFixerHtmlTextWriter:.Web.UI.HtmlTextWriter
{
private_url;
ernalFormFixerHtmlTextWriter(TextWriterwriter):base(writer)
{
_url=HttpContext.Current.Request.RawUrl;
}

publicoverridevoidWriteAttribute(name,value,boolencode)
{
(_url!=null&&.Compare(name,\"action\",true)0)
{
value=_url;
}
base.WriteAttribute(name,value,encode);
}
}

}

把这个文件编译成dll并在你项目中引用它

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



这样就解决回发问题
Tags:  url重写有几种方式 url重写

延伸阅读

最新评论

发表评论