• 如何在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的方法,来实现回发后继续保持有地址。
  • 相关阅读:
    使用ANT入门例子
    React 项目中使用create-react-app创建项目引入antd样式不起作用的问题
    js中对象数组遍历,及区别
    vue中axios封装
    uni-app中开发需要注意事项
    git 提交代码和 合并分支 ,回滚代码
    vue..js3.0
    vue中强制组件重新渲染
    vuex中获取当前路由
    H5 video在移动端播放层级问题
  • 原文地址:https://www.cnblogs.com/cyun/p/5565492.html
Copyright © 2020-2023  润新知