求知若饥,虚心若愚

ASP.NET伪静态详解及配置

目录:

    一、什么是伪静态

    二、为什么要把网站伪静态化

    三、怎样在ASP.NET下配置伪静态(如果了解前面两项了,可以直接从第三项开始看)

    四、相关知识

    五、引用

 

一、什么是伪静态

 

    定义:动态网页通过重写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、伪静态的用处

 

    有些用户觉得,伪静态和真静态实际被收录量会相差很大,其实不然,从你个人角度,你去判断一下一个帖子到底是真静态还是伪静态?估计很难看得出,因为所谓静态的意思,就是地址中不带问号,不带问号的就是静态,管他是真的还是伪的?搜索引擎看得出吗?所以说,其实不论是真的还是伪的,其实对于搜索引擎来说都是一样的,搜索引擎没有说,你这个是伪的,我不收录你。

 

    追根究底来说,为什么搜索引擎会不收录带问号的网址?因为搜索引擎怕由于问号而进入死循环,称为"搜索机器人陷阱(Spidertraps)"(以前动网就有这样一个漏洞,蜘蛛进去出不来了),所以很多时候带问号的地址搜索引擎是不会进去的,伪静态对于搜索引擎来说,其实就是静态,因为地址中没有带问号,所以没有真静态比伪静态收录得多的说法。

 

    2、为什么选择伪静态?

 

    有很多用户说:真静态不好吗?为什么不用真静态?访问起来不是更快吗?负载不是更好吗?等等等等……

 

    在这里,其实只用一个问题来回答:为什么选择MYSQL?很多用户大概不明白为什么那么多大型论坛都选择了MYSQL数据库作为储存机制,大概大部分都是想:"因为DZ用了MYSQL,所以就是MYSQL".

 

    其实不然,试想DZ为什么会在那么多论坛程序并存的日子生存下来并笑傲江湖,很大原因是因为DZ用了MYSQL.试想如果大C当年改的程序是一个文本论坛,那还会有DZ的今天吗?或者从另一个角度问,为什么那么多大型网站都选择了MYSQL而不是文本作为储存机制?

 

    所谓文本论坛,实际就跟真静态的说法差不多了,将数据储存在空间上面,大量读写硬盘,等等……

 

    为什么这种写法会被淘汰呢?我相信答案不会是老师所说的:"Discuz!目前有 2129867 篇帖子,存储成html的话大约是 20799M,也就是 20G左右。这当中还不计算由于磁盘存储机制造成的空间浪费(100个 1k的文件占用的空间可能会是200K)。"

 

    这种说法从我个人观点来看,这个理由不能给用户不使用真静态充分的理由。然而,另一个理由却是值得我们注意思考的,也是为什么绝大多数站都不选择生成静态:

 

    "删除、更新这些html内容会导致大量的磁盘io操作以及大量的磁盘碎片。"

 

    正如上面的说法,在实际当中确实会导致大量的磁盘I/O操作(input/output),大量进行I/O操作带来的后果可想而知,会产生大量的磁盘碎片甚至会导致硬盘出现坏道。

 

    所以对于生成静态而言,还不如去用文本论坛,可以更好的解决你们的需求。(副W就是做文本论坛出生的,当时的名字为ofstar,后因发展困难转为MYSQL,而PW生成静态页面也就是PW以前文本方式稍加改进用于吸引用户眼球的噘头)

 

    当然,如果大家记忆力好的话,应该可以记得PW4的时候PW论坛不能访问很长一段时间,后来恢复到一段时间前的数据,官方的说法是被人攻击而导致硬盘损坏,其实这种说法是比较不可信的,相对于是被攻击导致硬盘损坏还是大量I/O操作而产生的后果,我个人更倾向于后者。

 

    当然,如果大家比较关注5d6d的话,应该知道前几天有一天时间5d6d无法访问,根据非官方消息是因为硬盘坏了,而损坏的原因我想当然是因为大量用户大量进行I/O操作了,试想,我们一个论坛,进行磁盘I/O操作的仅为管理员进行更新缓存时进行的,而5d6d每一个会员就是一个管理员,试想下对磁盘是多大的考验?所以我并不奇怪5d6d的硬盘坏了。

 

    当然,也许在读这篇文章的很多朋友都有使用过BT,也听说过BT对硬盘很伤,不能开多,而所谓伤害,和这里指的都是同一样东西,大量I/O导致磁盘出现碎片甚至出现磁盘坏道。

 

    这里都是说些很实际的例子来说明问题了。

 

    3、伪静态的坏处

 

    当然犹如一篇文章的作者所说的:"如果流量稍大一些使用伪静态就出现CPU使用超负荷,我的同时在线300多人就挂了,而不使用伪静态的时候同时在线超500人都不挂,我的ISS数是1000."

 

    确实是这样的,由于伪静态是用正则判断而不是真实地址,分辨到底显示哪个页面的责任也由直接指定转由CPU来判断了,所以CPU占有量的上升,确实是伪静态最大的弊病。

 

    4、我们应该选择伪静态还是真静态?

 

    我们来总结一下:

 

    (1)、使用真静态和假静态对SEO来说没有什么区别

 

    (2)、使用真静态可能将导致硬盘损坏并将影响论坛性能

 

    (3)、使用伪静态将占用一定量的CPU占有率,大量使用将导致CPU超负荷

 

    (4)、最重要的一点,我们要静态是为了SEO

 

    所以:

 

    (1)、使用真静态的方法可以直接排除了,因为无论怎么生成,对硬盘来说都是很伤的。

 

    (2)、既然真伪静态的效果一样,我们就可以选择伪静态了。

 

    (3)、但是伪静态大量使用会照成CPU超负荷。

 

    (4)、所以我们只要不大量使用就可以了。

 

    (5)、既然静态只是给SEO看的,我们只需要伪静态给SEO就行了,不需要给用户使用。

 

    (6)、所以我们只要在专门提供给SEO爬的Archiver中使用伪静态就可以了。

 

    (7)、谢谢大家耐心看我写的文章。

 

    (8)、有何不解的地方或是有不同的看法欢迎提出。

 

    5、关于伪静态和真静态的评论

 

    真正的静态化和伪静态还是有本质的区别的。为浏览用户处理一个纯粹htm和一个调用多个数据的php在CPU的使用率方面明显前者少。记得原来有个人说html下载硬盘读写频繁,他这么说好像读取数据库不用读写磁盘似的,何况还有一大堆缓存的零散php也是放在硬盘的,这些读取不用磁盘操作么?可笑。

 

    读取单个htm+图片Flash等附件就可以实现的目的,何苦要读数据库又要读php缓存文件又要重新整合数据输出再+图片Flash等附件这么大费周章呢?CMS首页不需要很多的互动的,论坛那一套不应该拿到这里来用,相反应该更多考虑的是:美观!兼容!信息的直观!性能!还有稳定!

 

    其实所谓的伪静态页面,就是指的URL重写,在ASP.NET中实现非常简单。首先你要在你的项目里引用两个DLL:ActionlessForm.dll、URLRewriter.dll。真正实现重写的是 URLRewriter.dll   但是如果你要实现分页,那么必须使用这个ActionlessForm .dll。

 

三、怎样在ASP.NET下配置伪静态

 

    下载地址1:http://download.csdn.net/source/524514
    下载地址2:http://www.nmju.net/UserFiles/URLRewriter.rar
    下载地址3:http://download.microsoft.com/download/0/4/6/0463611e-a3f9-490d-a08c-877a83b797cf/MSDNURLRewriting.msi

 

    URLRewriter.dll

 

    1、首先,去下载MSDNURLRewriting.zip,不要在网络上直接下载URLRewriter.dll,一般网络上的URLRewriter.dll都是未经过编译重新生成只有8k大小,而实际的大小是20k左右。

 

    2、MSDNURLRewriting.zip解压后会有MSDNURLRewriting.msi文件,点击安装,在安装文件中可以找到 URLRewritingCode.sln,点击打开,然后重新生成解决方案,就可以得到重新生成的URLRewriter.dll(20k大小)。

 

    3、把URLRewriter.dll复制一份到项目的bin文件下,然后添加引用。

 

    4、下面就是Web.Config文件的配置了

 

    4.1.在web.config文件中  <configuration>节点的<configSections>下面的配置节点

 

    <!--配置重写规则节点-->

    <section name="RewriterConfig" type="URLRewriter.Config.RewriterConfigSerializerSectionHandler, URLRewriter" />

 

    4.2.在 <configuration>节点范围类编写重写规则

 

 1       <!--重写规则-->
 2 
 3       <RewriterConfig>
 4 
 5           <RewriterRule>
 6 
 7             <LookFor>~/index.html</LookFor>
 8 
 9             <SendTo>~/index.aspx</SendTo>
10 
11           </RewriterRule>
12 
13           <RewriterRule>
14 
15             <LookFor>~/s.html</LookFor>
16 
17             <SendTo>~/s.aspx</SendTo>
18 
19           </RewriterRule>
20 
21           <RewriterRule>
22 
23             <LookFor>~/s/(.[\w]*)/(.[\d]*).html</LookFor>
24 
25             <!--(.[\d]*)(.[\w]*).html  或者 ss_,(.[0-9]*),(.[0-9]*)\.html-->
26 
27             <SendTo><![CDATA[~/s.aspx?wd=$1&type=$2]]></SendTo>
28 
29           </RewriterRule>
30 
31           <RewriterRule>
32 
33             <LookFor>~/s/(.[\w]*)/(.[\d]*)/(.[\d]*).html</LookFor>
34 
35             <SendTo><![CDATA[~/s.aspx?wd=$1&pn=$2&type=$3]]></SendTo>
36 
37           </RewriterRule>
38 
39       </RewriterConfig> 

 

    4.3.在 <system.web>节点中的 <httpHandlers>下面配置

 

      <add verb="*" path="*.aspx" type="URLRewriter.RewriterFactoryHandler, URLRewriter" />

      <add verb="*" path="*.html" type="URLRewriter.RewriterFactoryHandler, URLRewriter" />

      <!--不加此节点不能定向html页面-->

 

    5、配置IIS解析.html文件

 

    配置IIS6.0IIS

 

    配置:网站->属性 ->虚拟目录->配置(G)...->映射->通配符应用程序映射->添加

 

    可执行文件:c:/windows/microsoft.net/framework/v2.0.50727 /aspnet_isapi.dll

 

    扩展名为:.html

 

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

 

    配置IIS7.5

 

    你的网站-->IIS中处理程序映射-->

 

    添加脚本映射(路径:*.html 可执行文件%windir%/Microsoft.NET/Framework/v2.0.50727/aspnet_isapi.dll 名称:任意,比如Hml )

 

    添加通配符脚本映射(路径:* 可执行文件:C:/Windows/Microsoft.NET/Framework/v2.0.50727/aspnet_isapi.dll 名称:任意,比如All)

 

    托管处理程序映射(路径:* 可执行文件:System.Web.UI.PageHandlerFactory 名称 任意 比如Html-Integrate)-------->

 

    IIS中 模块-->添加---->(名称:任意 如All 类型:URLRewriter.ModuleRewriter 把 仅针对向asp.net 应用程序或托管处理程序发出请求调用 勾上 ok )

 

    6、以上配置好之后就可以通过以下方式来访问了

 

    例如用户输入 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就可以帮你实现,并且这一切不需要多少的代码

 

四、相关知识

 

    1、正则表达式

 

    有一个经典的教程: 正则表达式30分钟入门教程,大家可以搜索一下。这个教程的确很简单,看完基本上写一些简单的正则就没有问题了。正则是一个需要长期使用的工具,隔段时间不用会忘记,所以我每次都看一遍这个教程。其实学过之后重要的就是一点内容。

 

    简单罗列如下:

 

    .换行符以外的所有字符

    \w 匹配字母或数字或下划线或汉字

    \s 匹配任意的空白符

    \d 匹配数字

    \b 匹配单词的开始或结束

    ^ 匹配字符串的开始

    $ 匹配字符串的结束

    * 重复零次或更多次

    + 重复一次或更多次

    ? 重复零次或一次

    {n} 重复n次

    {n,}重复n次或更多次

    {n,m} 重复n到m次

 

    应用替换时,前面第一个()中匹配的内容后面就用$1引用,第二个()中匹配的就用$2应用……(见4.2)这个个()里面的东东叫原子组。

 

    2、XML CDATA

 

    术语 CDATA 指的是不应由 XML 解析器进行解析的文本数据(Unparsed Character Data)。在 XML 元素中,"<" 和 "&" 是非法的。"<" 会产生错误,因为解析器会把该字符解释为新元素的开始。"&" 也会产生错误,因为解析器会把该字符解释为字符实体的开始。

    某些文本,比如 JavaScript 代码,包含大量 "<" 或 "&" 字符。为了避免错误,可以将脚本代码定义为 CDATA。

CDATA 部分中的所有内容都会被解析器忽略。(见4.2)

 

五、引用:

 

    http://www.duote.com/tech/5/14543.html

 

    http://blog.csdn.net/rwm5366745/article/details/5848949

 

    http://www.yzzmf.com/bbs/forum.php?mod=viewthread&tid=1398

 

转载请说明出处

posted @ 2013-05-05 15:22  初行  阅读(6749)  评论(5编辑  收藏  举报