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

 

轉載請說明出處


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM