“靜态頁”,在Web應用程式開發中是很常見的概念。隻是我發現目前還是有相當部分的朋友,在這方面的存在一定的誤區。是以現在獨立寫一篇文章,也想把一些問題講講清楚,以後在讨論的時候也好有個準。
網頁生成靜态Html檔案有許多好處,比如生成html網頁有利于被搜尋引擎收錄,不僅被收錄的快還收錄的全。前台脫離了資料通路,減輕對資料庫通路的壓力,加快網頁打開速度。
這種說法存在一個嚴重的問題,因為它混淆了兩個概念:“靜态頁”有利于網站性能,和“靜态頁”有利于SEO。有朋友可能會說:“這兩點說的都沒有錯啊,不信你去搜尋引擎上查一下,都有很多資料”。是的,這兩種說法都能在搜尋引擎上找出“依據”來,隻可惜在這種兩種情況下的“靜态頁”所指的内容,或者說是“做法”完全不同,可以說沒有任何關系。換句話說,這裡造成“混淆”的原因是“指代不明”。為了友善闡述,在本文接下來的部分中将盡可能避免“靜态頁”,“靜态化”等詞語,而是使用以下兩種區分明顯的說法進行闡述:
規範頁面URL
緩存頁面内容
如今在開發的Web應用程式時,往往需要從用戶端擷取一些資訊,然後根據這些資訊生成頁面。例如,我們需要從用戶端擷取一個“頁碼”,然後在頁面上呈現出這一頁的内容。從用戶端傳遞資訊的方式有多種,其中最常見的便是通過Query String進行傳遞。例如,我們可以通過Article.aspx?id=3這樣的方式來請求id為3的文章。不過如果純粹使用Query String來傳遞資訊的話,一個URL可能會帶有許多項Query String。例如ArticleList.aspx?page=3&keywords=helloworld&category=6&....。
有種說法是,這樣的URL由于明顯是動态的,是以搜尋引擎對它的處理會有所負面傾斜,例如将其權值放低。是以,很多程式都會把為URL規範為特别的形式,例如Article/3,甚至是Article_3.html。使用htm或html作為URL的結尾,是為了“欺騙”搜尋引擎,讓搜尋引擎以為這是一個直接從儲存設備上直接讀取的資源,它不會改變,是以“它的權值會相對提高”。實際上老趙并不同意這個說法,而且似乎也沒有實際案例可以證明這一點——當然我也無法證否,是以無法判斷這個說法的正确性。不過這篇文章并不是在追究這個問題,在這裡我們暫且認為它有道理吧。
用戶端
伺服器端
Article_3.html
Article_3.html => Article.aspx?id=3 => 處理 => 輸出
對于搜尋引擎的爬蟲來說,它根本意識不到這個URL是在直接讀取資源,還是經過了動态的請求。我們是Web應用程式的編寫者,對于一個請求我們可以使用我們任意的方式進行處理,想欺騙搜尋引擎還不是易如反掌?不過這種做法對于網站性能來說是否有幫助?沒有,肯定沒有。
這種改變URL,想要擷取更好SEO效果的做法,有些人也會把它叫做“僞靜态化”。老趙不知道這種說法合不合适,我是從來不會使用這樣的說法的。
動态生成一個頁面的開銷往往很大,例如需要多次查詢資料庫或者外部服務。為了減少伺服器端的開銷,為了加快網站的運作效率,有時候在伺服器端會将一個頁面的整體内容儲存為一個檔案,這樣每次在伺服器端擷取用戶端請求的時候,隻要讀取相應的檔案即可,而不需要重新查詢資料庫或外部服務并重新生成頁面内容:
Article.aspx?id=3
Article.aspx?id=3 => 讀取檔案 => 輸出
同樣的,這些事情完全是在伺服器端進行的處理,搜尋引擎的爬蟲對此一無所知。即使搜尋引擎認為Article.aspx?id=3這樣的請求是由伺服器端即時生成的(當然搜尋引擎真不會考慮這些),我們編寫的伺服器端邏輯同樣可以直接讀取磁盤上的檔案,并且直接輸出。這種做法自然是為了效率,不過……
這種做法和SEO有沒有關系?沒有任何關系,因為爬蟲根本不知道我們做了這些。
這種做法是否需要在硬碟上生成一個html檔案?沒有必要,我可以生成txt檔案,可以生成jeffz檔案,甚至我可以不生成檔案,而是将頁面内容直接存放在記憶體中,甚至是高性能的Key/Value Store裡。
這種做法是否需要把URL修改為html結尾?沒有必要,URL改不改都無所謂,改成什麼也都無所謂。
有時候事情其實就是那麼簡單,但是還是會讓人混淆。一句話聽上去很正确,但是一旦“指代不明”,正确的話也變成錯誤的了。例如本文一開始引用的文章,它是為了“緩存頁面内容”而使用的做法,這個做法和SEO沒有任何關系,是以說“生成html網頁有利于被搜尋引擎收錄,不僅被收錄的快還收錄的全”是将其目的與“規範頁面URL”混淆了起來。錯誤産生在這裡。在那片文章後面的評論中,有朋友回複說目前的搜尋引擎已經不關心URL是否是html還是别的什麼形式了。這種說法可能也是正确的,不過并沒有談在點子上。因為無論搜尋引擎如何處理HTML,文章的内容都和搜尋引擎沒有一絲一縷關系。
是以,如果您以後要談“靜态頁”或網頁“靜态化”的時候,請區分您究竟是在談“規範頁面URL”還是“緩存頁面内容”。
如果您說“靜态頁有助于SEO”,明白人知道您是再指“規範頁面URL”,而某些朋友可能就會認為您是指在伺服器端緩存頁面内容。
如果您說“靜态頁有助于提高網站性能”,明白人知道您是指“緩存頁面内容”,而某些朋友可能就會認為您是指使用“URL重寫”來規範URL樣式。
如果您說“靜态頁,既有助于SEO,又有助于提高網站性能”,那麼(我希望)明白人就會帶您來看現在這篇文章,而某些朋友可能就會……哎哎。
有朋友提到靜态資源适合被CDN分發,其實不然。CDN難道不能分發動态請求生成的内容了嗎?對于CDN來說,動态和靜态是沒有差別的。不說CDN,就說Squid吧,Squid知道後面連接配接的請求是靜态還是動态的嗎?是Windows系統還是Linux嗎?其實這就是“分層”,抽象出來以後完全不知道後端的遞交方式。而且換個角度想,世界上有“靜态請求”這個東西嗎?不都是需要經過Web伺服器處理的嗎?隻不過,一個是複雜運算,一個是直接讀取硬碟檔案。對通路者來說,是看不出任何差別的。CDN分發的也隻是“請求内容”而不會關心“内容的生成方式”。