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&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.相关参考资料
(4)ASP.NET伪静态页面的实现和伪静态在IIS7.0中的配置