偽靜態技術產生的背景:
1、靜態網頁與動態比較:
1)靜態網頁:
優勢:A、 對搜尋引擎友好,被收錄的品質高;B、訪問速度快;C、資源(cpu 等)佔用少。
劣勢:A、對於大型門戶,或者社區來說,不斷的修改將會產生大量I/O,會導致磁碟出現片段甚至出現磁碟壞道。相當恐怖一個隱患。使用者資訊一旦沒有了就沒戲玩了。B、儲存空間佔用會多一些。
2)動態網頁:
優勢:相對於靜態,它的劣勢也就是動態優勢所在——佔用空間少,對硬碟友好。
劣勢:A、對搜尋引擎不友好。搜尋引擎會不收錄帶問號的網址?因為搜尋引擎怕由於問號而進入死迴圈。
B、高並發時資源佔用較多。
而偽靜態就是在這樣背景下應運而生了,它在保留動態優點的基礎上,使得網址靜態化,也就是讓網址裡不帶問號,騙過收錄的爬蟲就行了。這樣完美地糅合了前邊兩者的優點。
優點:靜態優點+動態優點
不足:流量稍大一些使用偽靜態就出現CPU使用超負荷,由於偽靜態是用正則判斷而不是真真實位址,分辨到底顯示哪個頁面的責任也由直接指定轉由CPU來判斷了,所以CPU佔有量的上升,確實是偽靜態最大的弊病.
實現機制:是利用伺服器端,對請求的動態網頁面做改動,讓瀏覽器認為訪問的也是靜態頁面,這個時候,瀏覽器地址欄中顯示的就是靜態地址資訊(不帶問號)了。
兩種實現方法:
1、使用ISAPI_Rewrite進行動態連結重寫HTML靜態網址。ISAPI_Rewrite是一個dll組件,re_write是iis裡的一個模組。這個篩選器實現是通過Regex,將動態網頁網址映射成為靜態網址。如可將news.asp?id=95通過re_write將其轉換成news/95.html。映射的Regex在httpd.ini檔案裡進行設定。
舉個小小例:處理資料翻頁,那麼寫法是:
More_<%=Page%>_<%=type%>.html (註:page是翻頁頁數,type是資料類型)表現形式:More_1_95.html
如果翻下一頁,則為:More_2_95.html,繼續下一頁的迴圈,則是:
More_3_95.html,以此類推。
不過你需要在httpd.ini檔案中增加以下代碼:
RewriteRule /More_("d+)_("d+)".html /jsp/more".asp"?page=$1&type=$2 [N,I] 字串9
如果你的動態程式有多個參數需要傳遞,那麼就增加多個("d+)即可,如下:
RewriteRule /More_("d+)_("d+)_("d+)".html /asp/more".asp"?page=$1&type=$2&type2=$3 [N,I]
優點:在程式上基本不需做什麼變化。麻煩:要實現這個需要對iis進行控制,所以當你租用別人的伺服器時,則需要先跟服務商聯絡。(當然這個是對asp而言,asp.net就不用——直接將dll程式集放到程式中的bin再適當的配置即可實現)
2、IIS的404錯誤處理機制:通過自訂錯誤,轉向我們準備好的處理頁。不過這種可拓展性有待研究,對程式處理的統籌要求也高,不大適合實際應用的樣子。
首先,佈建網站屬性-自定意錯誤
找到HTTP錯誤404,然後編輯屬性->訊息類型選中URL->URL填入“/index.asp”,或您的錯誤處理頁面.
這樣,比如訪問http://www.gz909.cn/12345.html 時(12345為文章在資料庫的ID).由於些頁面不存在,所以觸發了404錯誤.轉向了index.asp
在index.asp裡加
CurrDomain=Request.ServerVariables("HTTP_HOST") '當前訪問網域名稱
CurrURL=Replace(Request.ServerVariables("QUERY_STRING"),"404;http://"&CurrDomain&":80","") '當前訪問URL
此時的CurrURL應該是:12345.html .
這樣,就得到使用者正在試圖訪問的頁面.然後提取裡邊的文章ID(應該為:12345),用正則,這裡就不多說了.
然後到資料庫裡提取出文章內容.輸出到頁面裡,就OK了.
結論:偽靜態適合用在普通的企業網站上了——既不要求高並發,但同時又很在乎seo(搜尋引擎最佳化),而且也要求後台可動態更新。——當然實現直接產生靜態頁也行,因為這種不像社區那種修改量那麼大。