url重写:使用C#.NET重写URL方法(一)来源: 发布时间:星期四, 2009年2月12日 浏览:640次 评论:0
URL重写是截取传入Web请求并自动将请求重定向到其他URL过程 比如浏览器发来请求hostname/101.aspx服务器自动将这个请求中定向为http://hostname/list.aspx?id=101 url重写优点在于: 缩短url隐藏实际路径提高安全性; 易于用户记忆和键入; 易于被搜索引擎收录; 实现URL重写几个步骤: 第: 下载MSURLRewriter.dll放到你webbin下 下载地址:download.microsoft.com/download/0/4/6/0463611e-a3f9-490d-a08c-877a83b797cf/MSDNURLRewriting.msi 第 2: 下载完成后在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> <LookFor>~/d(\\d+)\\.aspx</LookFor>表示用户输入urld(\\d+)\\.aspx是url中文件名匹配正则表达式(此处为字母d开头后面跟个或多个数字并以.aspx结尾用户也可根据自己需要自行设定) [Page] <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网页顶部添加以下内容: <%@RegisterTagPrefix=\"skm\"Namespace=\"ActionlessForm\"Assembly=\"ActionlessForm\"%> [Page] 然后将<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) { (_url!=null&&.Compare(name,\"action\",true)0) [Page] { 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 这样就解决回发问题 1
相关文章读者评论发表评论 |