zoukankan      html  css  js  c++  java
  • ASP.NET伪静态 UrlRewrite(Url重写) 实现和配置

    核心提示:大 家一定经常在网络上看到很多网站的地址后缀都是用XX.HTML或者XX.ASPX等类似静态文件的标示来操作的吧,那么大家有怀疑过他真的是一个一个的 静态生成的文件么,静态文件的生成的优缺有好有坏,对于访问量很大的网站,利用静态文件可提高服务器的运行稳定和速度...
     

    大家一定经常在网络上看到很多网站的地址后缀都是用XX.HTML或者XX.ASPX等类似静态文件的标示来操作的吧,那么大家有怀疑过他真的是一 个一个的静态生成的文件么,静态文件的生成的优缺有好有坏,对于访问量很大的网站,利用静态文件可提高服务器的运行稳定和速度,坏处就是生成列表的时候会 因为增加一条记录从而需要所有相关的列表进行重构,当然不排除有的公司已经攻克的这个问题,但对于大众程序员来说,他依旧是个问题,而且生成的化对于中小 型网站也不一定会比动态的号,因为管理比较麻烦。

    结构以上事实,然后伪静态技术产生了,规范的说就是URL重写技术,他对于ASPX格式支持最好,当然也可以重写HTML格式的文件,但这需要 IIS的设置,相对比来说,ASPX格式的更方便,本站就是采用了该URL重写技术,这个技术优点显而易见:方便搜索引擎收录,方便查看,等等。那么接下 来我们来看看如何配置他吧

    首先你要在你的项目里引用两个DLL:

    URLRewriter.dll
    ActionlessForm.dll

    真正实现重写的是 URLRewriter.dll 但是如果你要实现分页,那么必须使用这个ActionlessForm.dll

    URLRewriter.dll
    1、下载文件

    2、配置WEB.CONFIG文件
    在项目中引用这个程序集,伪静态语法...(例把.aspx 的页面 用.html来表示,web.config文件中--> 添加 以下节点
    <configuration>
      <configSections>
        <section name="RewriterConfig" requirePermission="false" type="URLRewriter.Config.RewriterConfigSerializerSectionHandler, URLRewriter" />
      </configSections>

      <RewriterConfig>
        <Rules>
          <RewriterRule><!--一个参数->
            <LookFor>~/cn/ss_(.[d]*).html</LookFor>
            <SendTo>~/cn/news.aspx?id=$1</SendTo>
          </RewriterRule>
          <RewriterRule><!--传两个参数的-->
            <LookFor>~/cn/ss_(.[d]*)0(.[w]*).html</LookFor> <!--(.[d]*)(.[w]*).html  或者 ss_,(.[0-9]*),(.[0-9]*).html-->
            <SendTo><![CDATA[~/cn/news.aspx?id=$1&sid=$2]]></SendTo>
          </RewriterRule>
          <RewriterRule><!--三个参数-->
            <LookFor>~/cn/ss_(.[d]*)0(.[w]*)0(.[w]*).html</LookFor>
            <SendTo><![CDATA[~/ZH-CN/news.aspx?id=$1&sid=$2&n_id=$3]]></SendTo>
          </RewriterRule>
          <RewriterRule>
            <LookFor>~/dfsaddf/index(d*).html</LookFor>
            <SendTo>~/Favorites_Page.aspx</SendTo>
          </RewriterRule>
        </Rules>
      </RewriterConfig>
    </configuration>


    <system.web>
      <httpHandlers> 
            <add verb="*" path="*.aspx" type="URLRewriter.RewriterFactoryHandler, URLRewriter" /> 
            <add verb="*" path="*.html" type="URLRewriter.RewriterFactoryHandler, URLRewriter" /> 
      </httpHandlers>
    </system.web>

    <!--
    <httpModules>
          <add type="URLRewriter.ModuleRewriter, URLRewriter" name="ModuleRewriter"/>
    </httpModules>
    -->

    设置完以上步骤,就基本可以运行了,其中<RewriterRule/>标签里面就是重写的一个模块,<LookFor/>里面的是重写后的地址,而<SendTo/>则是原地址。

    3、配置IIS解析.html文件
    配置IIS6.0IIS配置:网站->属性 ->虚拟目录->配置(G)...->映射->通配符应用程序映射->添加
    可执行文件:c:windowsmicrosoft.netframeworkv2.0.50727 aspnet_isapi.dll
    扩展名为:.html

    确认文件是否存在:不选.

    配置IIS7.5你的网站-->IIS中处理程序映射-->
    添加脚本映射(路径:*.html 可执行文件%windir%Microsoft.NETFrameworkv2.0.50727aspnet_isapi.dll 名称:任意,比如Hml )
    添加通配符脚本映射(路径:* 可执行文件:C:WindowsMicrosoft.NETFrameworkv2.0.50727aspnet_isapi.dll 名称:任意,比如All)
    托管处理程序映射(路径:* 可执行文件:System.Web.UI.PageHandlerFactory 名称 任意 比如Html-Integrate)-------->
    IIS中 模块-->添加---->(名称:任意 如All 类型:URLRewriter.ModuleRewriter 把 仅针对向asp.net 应用程序或托管处理程序发出请求调用 勾上 ok )
    -->ok
    4、以上配置好之后就可以通过以下方式来访问了

    例如用户输入 hostname/d11.html,
    服务器会把他重写为http://hostname/default.aspx?id=11。
    换句话说用户输入http://hostname/d11.html,
    实际访问的是http: //hostname/default.aspx?id=11
    ActionlessForm.dll
    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);
            }
        }
    }

    创建此类并对其进行编译之后,要在 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>

    成功!
    虚拟主机

    在网上看到,很多朋友在asp.net中做urlrewrite,用的是HttpHandle+Server.Transfer的方法。其实这种方法是错误的。

    第一,HttpHandle是实现不了urlrewrite的;

    第二Server.Transfer是标准的重定向,根本不是urlrewrite。

    其实,实现urlrewrite不用自己HttpHandle,也不用自己实现HttpModule,用几行代码就可以轻松实现。我这里介绍的是在 虚拟主机上,虚拟主机不同于自己的服务器,你是没有权限去修改iis,也没有权限去安装iis rewrite之类的iis插件。但是我们仍然可以轻松完成需要的功能。具体做法如下:打开global.asax.cs,定位到protected void Application_BeginRequest(Object sender, EventArgs e)。从方法名我想也能猜到它是做什么的。输入如下代码:


    protected void Application_BeginRequest(Object sender, EventArgs e)
    {
    string oldUrl = HttpContext.Current.Request.RawUrl ;
    string pattern = @"^(.+)default/(d+).aspx(?.*)*$";
    string replace = "$1default.aspx?id=$2"; if(Regex.IsMatch(oldUrl, pattern, RegexOptions.IgnoreCase | RegexOptions.Compiled))
    {
    string newUrl = Regex.Replace(oldUrl, pattern, replace, RegexOptions.Compiled | RegexOptions.IgnoreCase); 
    this.Context.RewritePath(newUrl); 

    }

    有了上边这段代码,我访问一个类似:.../default/123.aspx 的网址,当然这个网址在我的电脑上不存在,它就会被定向到:.../default.aspx?id=123。

    当然,利用功能强大的正则表达式,你可以任意按照自己的需要来重写url,这一切都是在服务器端默默的进行,在客户端是不会有任何察觉的。由于是在 虚拟主机上,我们只能重定向.aspx文件,如果是自己的服务器,只要把后缀名在iis中注册一下,就可以实现任意后缀名的处理。比如你可以注册一 个*.myweb这样的类型,这样别人访问default/456.myweb时,你可以把它重定向到default.aspx?id=456。总之一句 话,只要你能想到,.net就可以帮你实现,并且这一切不需要多少的代码。

    转至:http://www.58soft.com.cn/information_content/2277.aspx

  • 相关阅读:
    树状数组简述
    八皇后
    小木棍
    智力大冲浪
    晚餐队列安排
    修理牛棚
    转圈游戏
    关押罪犯
    借教室
    跳石头
  • 原文地址:https://www.cnblogs.com/58soft/p/3942452.html
Copyright © 2011-2022 走看看