zoukankan      html  css  js  c++  java
  • 如何在URL重写后,form标记中的Action值也用虚拟地址?

    如何在URL重写后,form标记中的Action值也用虚拟地址?
    2008-09-17 16:40
    如何在URL重写后,form标记中的Action值也用虚拟地址?
    例如我们将一个地址"showpost.aspx?postid=1000"重写为"posts/1000.aspx",如果这个页面中有个表单 (form),那么输出到浏览器的HTML中,这个表单的action属性为<form action="showpost.aspx?postid=1000">而不是我们期望的<form action="1000.aspx">,这样就会暴露我们的真实地址,而且感觉也不爽。

    我们可以通过自定义页面基类,重写默认的HtmlTextWriter方法,重写属性输出WriteAttribute(string name, string value, bool encode)方法,当输出action时,将action属性的值强制转换为当前虚 URL(HttpContext.Current.Request.RawUrl,上面的1000.aspx)

    最后就是让所有的页面都调用这个基类,修改一下Web.config就好了
    <!-- Openlab.Controls.OLPage为页面基类,Openlab.Controls为基类所在dll -->
    <pages pageBaseType="Openlab.Controls.OLPage, Openlab.Controls"/>

    附页面基类完整代码(参考CS代码完成):

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

    namespace Openlab.Controls
    ...{
         /**//// <summary>
         /// 页面基类
         /// </summary>
         public class OLPage : Page
         ...{
             public OLPage()
             ...{
             }

             Render#region Render

             /**//// <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);
             }
             #endregion


         }

         FormFixers#region FormFixers

         FormFixerHtml32TextWriter#region FormFixerHtml32TextWriter
         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);
             }
         }
         #endregion
        
         FormFixerHtmlTextWriter#region FormFixerHtmlTextWriter
         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);
             }
         }
         #endregion

         #endregion
    }















    下面介绍的是微软的URLRewriter方法  

    1.首先下载URLRewriter.dll,下载之后直接复制到你的网站的bin目录中  
    2.配置你的web.config文件  
    在<configuration>节点下加  
    <configSections>  
    <section name="RewriterConfig" type="URLRewriter.Config.RewriterConfigSerializerSectionHandler, URLRewriter" />  
    </configSections>  

    <RewriterConfig>  
    <Rules>  
    <!--一下三个是我自己写的测试的,当然你可以写很多个 -->  
    <!--这个是把http://localhost:2001/default.aspx?id=1 生成http://localhost:2001/d1.aspx 这种页面 -->  
    <RewriterRule>  
    <LookFor>~/d(/d{0,5})/.aspx</LookFor>  
    <SendTo>~/default.aspx?ID=$1</SendTo>  
    </RewriterRule>  
    <!--这个是把http://localhost:2001/article.aspx?id=1 生成http://localhost:2001/1/a.html 这种页面 -->  
    <RewriterRule>  
    <LookFor>~/(/d{0,5})/a/.html</LookFor>  
    <SendTo>~/article.aspx?id=$1</SendTo>  
    </RewriterRule>  
    <!--这个是把http://localhost:2001/test.aspx?id=1 生成http://localhost:2001/1/ 这种页面 -->  
    <RewriterRule>  
    <LookFor>~/(/d{0,5})/</LookFor>  
    <SendTo>~/test.aspx?id=$1</SendTo>  
    </RewriterRule>  

    </Rules>  

    </RewriterConfig>  

    同时还要在<system.web>配置节下加  
    <httpHandlers>  
    <add verb="*" path="*.aspx" type="URLRewriter.RewriterFactoryHandler, URLRewriter" />  
    <add verb="*" path="*.html" type="URLRewriter.RewriterFactoryHandler, URLRewriter" />  
    <add verb="*" path="*" type="URLRewriter.RewriterFactoryHandler, URLRewriter" />  

    </httpHandlers>  

    3.好了,基本上就可以了,但是还有重要一点千万不要忘了  
    以上有三种情况的url生成  
    针对第一种情况,第一第二步配置完就可以实现了  
    可对第二种和第三种url情况,还需要进行一下配置  
    先说第二种情况:因为咱们重写的是.html后缀  
    所以需要在iis中进行.html映射,方法如下:  
    右击站点-属性-主目录-配置  
    在打开页面找扩展名.aspx,双击之后弹出窗口内复制可执行文件  
    一般是C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/aspnet_isapi.dll  
    或是C:/WINDOWS/Microsoft.NET/Framework/v4.0.30319/aspnet_isapi.dll
    复制完之后点添加在弹出窗口把内容复制到可执行文件  
    扩展名.html当然这个你可以任意写了,不过要和  
    <add verb="*" path="*.html" type="URLRewriter.RewriterFactoryHandler, URLRewriter" />  
    保持一致.  
    同时去掉确认文件是否存在,确定即可  
    完成之后输入http://localhost:2001/1/a.html  
    是不是就可以访问了?爽吧  

    下面介绍第三种情况,生成目录  
    这里面稍微有点复杂,同样配置iis  
    还是在那个弹出窗口,点插入  
    把复制的文件即C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/aspnet_isapi.dll  
    复制到可执行文件框内,同时去掉确认文件是否存在,确定即可  
    这样输入http://localhost:2001/1/,是不是就可以访问了?嘿嘿  
    可能读者会有疑问了:现在设置的这个和第二种设置的有什么区别?  
    现在设置的其实是进行*映射,即把所有的文件都进行url重写处理程序处理  
    这时其实就可以把.html 以及自带的.aspx等映射去掉,同样可以生成.html/.aspx/ url  
    好了,如果还想其他的扩展大家就尽情扩展吧。  

    4.现在再讲一下*映射要注意的问题  
    因为*映射是把所有的文件都要交给url称谢程序去处理,这样就会造成会把站点下的图片以及css  
    或者一些下载的rar等文件都要去处理,这样会慢吗?答案是毫无疑问的,肯定会增加内存的,  
    单单一网站的图片以及上传的图片就足以让程序减慢成倍的速度了。  
    那有什么办法进行处理吗?  
    当然,我们可以进行以下处理就可以把速度还原了:  
    方法1,把存放图片所在的文件夹转化成一个虚拟目录,在然后移处该虚拟目录*.*的映射,这样一来他的url重写程序就不会去处理图片文件,当然存放别的不需要url重写程序的文件也要象图片文件夹做类似的处理。  
    虚拟目录设置办法:在iis站点右击目录点属性,目录-点创建  
    然后点配置,在弹出窗口内删除:通配符应用程序映射(执行顺序)下添加的*.*的映射即可。  
    方法2,把不需要*.*映射的文件夹设置新站点和原来的站点分开,这样在原来的站点访问的时候用  
    新站点的域名即可。比如把图片设置站点http://images.ziuziu.cn,这样在http://ziuziu.cn站点访问图片的时候就必须使用http://images.ziuziu.cn/名称.gif,这样就避免了所有问件处理。  
    以上两种方法即可提高不少速度了,当然第一种药方便的多。  

    5.最后处理回发的情况大家可以在网上搜下即可。  

    对 于ASPX页面,我们在客户端查看代码时会发现,它自动为form加入了action,并且地址就是开头所说的原始页面地址。而对于ASPX页面,若当它 的action为空时也就将回发到当前地址。这样我们就可以通过在客户端清除action的方法,来实现回发后继续保持有地址。
  • 相关阅读:
    大数加法、乘法实现的简单版本
    hdu 4027 Can you answer these queries?
    zoj 1610 Count the Colors
    2018 徐州赛区网赛 G. Trace
    1495 中国好区间 尺取法
    LA 3938 动态最大连续区间 线段树
    51nod 1275 连续子段的差异
    caioj 1172 poj 2823 单调队列过渡题
    数据结构和算法题
    一个通用分页类
  • 原文地址:https://www.cnblogs.com/cyun/p/5565492.html
Copyright © 2011-2022 走看看