zoukankan      html  css  js  c++  java
  • ASP.NET伪静态实现

    1.什么是伪静态?使用伪静态的作用是什么?

    定义:动态网页通过重写URL的方法实现去掉动态网页的参数,但在实际的网页目录中并没有必要实现存在重写的页面。

    例如:我们当访问地址http://www.cnblogs.com/ForEvErNoME/archive/2012/06/05/2529259.html时,你会认为在站点服务器下存在名为2529259.html文件,其实实际上它可能是不存在的,而可能你看到的内容是通过重定向/archive/article.aspx?year=2012&month=06&day=05&id=2529259显示出来的。

    为什么要这样做呢?

    (1)增强URL的友好性,方便用户记忆URL。

    (2)提高搜索引擎抓取,很多搜索引擎更看好静态HTML页。

    (3)加强安全性,因为隐藏了参数"year"、"month"、"day"、"id",使网站没有那么容易受到攻击。

     

    2.伪静态实现的基本思路

    (1)自定义HttpHandler类,实现IHttpHandler接口

    (2)获取用户请求的URL地址信息

    (3)定义多个正则表达式规则,匹配URL字符串

    (4)重定向真实的URL地址信息

     

    3.自定义UrlRewriter类

    原理:通过实现接口IHttpHandler来接管HTTP请求。

    (1)定义UrlRewriter.cs类

    复制代码
     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Web;
     5 using System.Text;
     6 using System.Text.RegularExpressions;
     7 
     8 /// <summary>
     9 ///UrlRewriter 伪静态Url重写
    10 /// </summary>
    11 public class UrlRewriter:IHttpHandler
    12 {
    13     /// <summary>
    14     /// 自定义 HttpHandler
    15     /// </summary>
    16     /// <param name="context"></param>
    17     public void ProcessRequest(HttpContext context)
    18     {
    19         try
    20         {
    21             string url = context.Request.RawUrl;//获取用户请求的URL地址信息
    22             Regex Reg = new Regex(@"/detail-(d+)-(d+)..+", RegexOptions.IgnoreCase);//建立正则表达式 
    23             Match m = Reg.Match(url, url.LastIndexOf("/"));//用正则表达式进行URL字符串
    24             if (m.Success)//匹配成功
    25             {
    26                 string RealPath = @"~/admin/detail.aspx?type=" + m.Groups[1] + "&id=" + m.Groups[2];//重定向真实的地址信息
    27                 context.Server.Execute(RealPath);
    28             }
    29             else
    30             {
    31                 context.Response.Redirect(context.Request.Url.ToString());
    32             }
    33 
    34         }
    35         catch (Exception ex)
    36         { 
    37             context.Response.Redirect(context.Request.Url.ToString());  
    38         }
    39     }
    40 
    41     /// <summary>  
    42     ///  如果 System.Web.IHttpHandler 实例可再次使用,则为 true;否则为 false。
    43     /// </summary>  
    44     public bool IsReusable
    45     {
    46         get { return false; }
    47     }
    48 }
    复制代码

     (2)在web.config中<system.web>节点下添加配置信息

    复制代码
    <?xml version="1.0"?>
    <configuration>
    <system.web>
      <httpHandlers>
        <!--使用自定义UrlRewriter类-->
        <add verb="*" path="*/detail-?*-?*.html" type="UrlRewriter"/>
        </httpHandlers>
        <compilation debug="true" targetFramework="4.0"/>
      </system.web>
    </configuration>
    复制代码

    解释:

    verb属性:是指处理程序支持的HTTP动作。如果某个处理程序支持所有的HTTP动作,请使用"*",否则使用逗号分隔的列表列出支持的动作。因此如果你的处理程序只支持HTTP "GET"和"POST",那么verb属性就应该是"GET", "POST"。

    path属性:指定了需要调用处理程序的路径和文件名(可以包含通配符)。例如,如果你希望自己的处理程序只有在test.html文件被请求的时候才被调用,那么path属性就包含”test.html“,如果你希望含有.html后缀的所有文件都调用处理程序,path属性应该为"*.html"。

    type属性:是指绑定的类名以及包括命名空间(如果有的话)。ASP.NET运行时首先搜索应用程序的bin目录中的部件DLL,接着在全局部件缓冲(GAC)中搜索。

    (3)打开网站输入http://localhost:28053/伪静态/detail-1-1.html,显示的是”admin/detail.aspx?type=1&id=1”的内容。(实例下载在文章最后)

     

    4.使用微软的URLRewriter.dll

    (1)添加URLRewriter.dll引用

    (2)配置web.config基本信息

    复制代码
    <?xml version="1.0"?>
    <configuration>
      <!--使用URLRewriter.dll -->
    <configSections>
      <section name="RewriterConfig" requirePermission="false" type="URLRewriter.Config.RewriterConfigSerializerSectionHandler, URLRewriter" />
    </configSections>
    
    <RewriterConfig>
      <Rules>
        <RewriterRule>
          <LookFor>~/detail/([0-9]*)/([0-9]*).html</LookFor>
          <SendTo>~/admin/detail.aspx?type=$1&amp;id=$2</SendTo>
        </RewriterRule>
      </Rules>
    </RewriterConfig>
    
    <system.web>
      <httpHandlers>
        <!--使用URLRewriter.dll    -->
      <add verb="*" path="*.aspx" type="URLRewriter.RewriterFactoryHandler, URLRewriter" />
      <add verb="*" path="*.html" type="URLRewriter.RewriterFactoryHandler, URLRewriter" />
    
    </httpHandlers>
        <compilation debug="true" targetFramework="4.0"/>
      </system.web>
    </configuration>
    复制代码

    简单介绍

    复制代码
    <RewriterConfig>
       <Rules>
       <RewriterRule>
          <LookFor>要查找的模式</LookFor>
          <SendTo>要用来替换模式的字符串</SendTo>
       </RewriterRule>
       <RewriterRule>
          <LookFor>要查找的模式</LookFor>
          <SendTo>要用来替换模式的字符串</SendTo>
       </RewriterRule>
       </Rules>
    </RewriterConfig>
    复制代码

    用reflector查看URLRewriter.dll,节点的信息是已经在类中定义好的,不能更改。

    (3)同样的,打开网站输入http://localhost:28053/伪静态/detail-1-1.html,显示的是”admin/detail.aspx?type=1&id=1”的内容。

     

    5.相关参考资料

    (1)在ASP.NET中执行URL重写

    (2)ASP.NET 实现伪静态网页方法

    (3)IIS7 伪静态 web.config 配置方法

    (4)ASP.NET伪静态页面的实现和伪静态在IIS7.0中的配置

     

     实例下载

     

  • 相关阅读:
    JDBC的PreparedStatement是什么?
    ArrayList、LinkedList、Vector 的区别。
    final finally finalize区别
    面向对象三大特性
    JDBC访问数据库的基本步骤是什么?
    报表中的地图怎么做?
    报表工具如何实现“点击查看原图”
    玩转报表排名之组内排名
    动态隐藏行
    OUT 了??还没玩转报表超链接
  • 原文地址:https://www.cnblogs.com/yanergui/p/5014281.html
Copyright © 2011-2022 走看看