zoukankan      html  css  js  c++  java
  • 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

    转载请说明出处

  • 相关阅读:
    antd4.x Form组建改变
    react hook 使用注意点
    Dockerfile怎么编写
    在spring boot中3分钟上手阿里巴巴服务熔断系统sentinel
    容器和镜像的导入导出及部署
    设计模式之 ==> 装饰器设计模式
    Jenkins + Gradle + Docker 自动化部署 SpringBoot 项目到远程服务器
    Linux运维常用的40个命令总结
    ceph集群部署
    tcpdump常用命令
  • 原文地址:https://www.cnblogs.com/zxlovenet/p/3061030.html
Copyright © 2011-2022 走看看