轉載自:http://www.cnblogs.com/ainiaa/archive/2010/07/25/1784564.html
一直在做php的開發工作.在開發的過程中老早就聽說了“偽靜態”這一說。但是一直沒有對其進行瞭解。
今天終於下定決定 要好好的瞭解下這方面的內容。
首先,什麼是偽靜態:
偽靜態又名URL重寫,是動態網址看起來像靜態網址。換句話說就是,動態網頁通過重寫 URL 方法實現去掉動態網頁的參數,但在實際的網頁目錄中並沒有必要實現存在重寫的頁面。
另外在補充兩個名詞解析
靜態網址:純靜態HTML文檔,能使用filetype:htm 查詢到的網頁
動態網址:內容存於資料庫中,根據要求顯示內容,URL中以 ? # & 顯示不同的參數,如:news.php?lang=cn&class=1&id=2
動態、靜態、偽靜態之間的利與弊(新)
動態網址
首先,動態網址目前對於Google來說,“不能被抓取”的說法是錯誤的,Google能夠很好的處理動態網址並順利抓取;其次“參數不能超過3個”的說法也不正確,Google能夠抓取參數超過3個的動態網址,不過,為了避免URL太長應盡量減少參數。
其次,動態網址有其一定的優勢,以上面所說的 news.php?lang=cn&class=1&id=2 為例,網址中的參數準確的告訴Google,此URL內容語言為cn、隸屬於分類1、內容ID為2,更便於Google對內容的識別處理。
最後,動態網址應盡量精簡,特別是會話標識(sid)和查詢(query)參數,容易造成大量相同頁面。
靜態網址
首先,靜態網址具有的絕對優勢是其明晰,/product/nokia/n95.html和/about.html可以很容易被理解,從而在搜尋結果中可能點擊量相對較高。
其次,靜態網址未必就是最好的網址形式,上述動態網址中說到,動態網址能夠告訴Google一些可以識別的參數,而靜態網址如果文檔布置不夠恰當(如:過於扁平化,將HTML文檔全放在根目錄下)及其他因素,反而不如靜態網址為Google提供的參考資訊豐富。
最後,?思蜀覺得Google此文中是否有其隱藏含義?“更新此種類型網址的頁面會比較耗費時間,尤其是當資訊量增長很快時,因為每一個單獨的頁面都必須更改編譯代碼。”雖然所說的是網站,但在Google系統中是否同樣存在這樣的問題呢?
偽靜態網址
首先,偽靜態網址不能讓動態網址“靜態化”,偽靜態僅僅是對動態網址的一個重寫,Google不會認為偽靜態就是HTML文檔。
其次,偽靜態可取,但應把重心放在去除冗餘參數、規範URL、儘可能的避免重複頁上。
最後,偽靜態有很大潛大危險,最好在對網站系統、網站結構、內容分布、參數意義熟悉的情況下使用。
在寫偽靜態規則時,應保留有價值的參數,不要將有價值的參數全部精簡掉,如前面例子中的 news.php?lang=cn&class=1&id=2 最好重寫為 news-cn-class1-id2.html,而不是過份精簡重寫為 news-2.html。
再就是偽靜態中一定不能包含會話標識(sid)和查詢(query)參數,/product.asp?sid=98971298178906&id=1234 這樣的動態網址,其中的sid本來Google能夠識別並屏蔽,但如果重寫為 /product/98971298178906/1234,Google不但無法識別,還在整站中造成無限重複頁面(每個會話都會產生一個新的會話ID)。
我們應該選擇偽靜態還是真靜態
1、使用真靜態和假靜態對SEO來說沒有什麼區別
2、使用真靜態可能將導致硬碟損壞並將影響論壇效能
3、使用偽靜態將佔用一定量的CPU佔有率,大量使用將導致CPU超負荷
4、最重要的一點,我們要靜態是為了SEO
所以:
1、使用真靜態方法可以直接排除了,因為無論怎麼產生,對硬碟來說都是很傷的。
2、既然真偽靜態效果一樣,我們就可以選擇偽靜態了。
3、但是偽靜態大量使用會造成CPU超負荷。
4、所以我們只要不大量使用就可以了。
5、既然靜態只是給SEO看的,我們只需要偽靜態給SEO就行了,不需要給使用者使用。
6、所以我們只要在專門提供給SEO爬的Archiver中使用偽靜態就可以了。
7、謝謝大家耐心看我寫的文章。
8、有何不解的地方或是有不同的看法歡迎提出
關於偽靜態和真靜態評論
真正的靜態化和偽靜態還是有本質的區別的。為瀏覽使用者處理一個純粹html和一個調用多個資料的php在CPU的使用率方面明顯前者少。記得原來有個人說html下載硬碟讀寫頻繁,他這麼說好像讀取資料庫不用讀寫磁碟似的,何況還有一大堆緩衝的零散php也是放在硬碟的,這些讀取不用磁碟操作嗎?可笑。
讀取單個html+圖片Flash等附件就可以實現的目的,何苦要讀資料庫又要讀php快取檔案又要重新整合資料輸出再+圖片Flash等附件這麼大費周章呢?CMS首頁不需要很多的互動的,論壇那一套不應該拿到這裡來用,相反應該更多考慮的是:美觀!相容!資訊的直觀!效能!還有穩定!
在轉一個 php偽靜態實現四法:
1 2 // 偽靜態方法一
3
4 // localhost/php100/test.php?id|1@action|2
5 $Php2Html_FileUrl = $_SERVER [ " REQUEST_URI " ];
6 echo $Php2Html_FileUrl . "
" ; // /php100/test.php?id|1@action|2
7 $Php2Html_UrlString = str_replace ( " ? " , "" , str_replace ( " / " , "" , strrchr ( strrchr ( $Php2Html_FileUrl , " / " ) , " ? " )));
8 echo $Php2Html_UrlString . "
" ; // id|1@action|2
9 $Php2Html_UrlQueryStrList = explode ( " @ " , $Php2Html_UrlString );
10 print_r ( $Php2Html_UrlQueryStrList ); // Array ( [0] => id|1 [1] => action|2 )
11 echo "
" ;
12 foreach ( $Php2Html_UrlQueryStrList as $Php2Html_UrlQueryStr )
13 {
14 $Php2Html_TmpArray = explode ( " | " , $Php2Html_UrlQueryStr );
15 print_r ( $Php2Html_TmpArray ); // Array ( [0] => id [1] => 1 ) ; Array ( [0] => action [1] => 2 )
16 echo "
" ;
17 $_GET [ $Php2Html_TmpArray [ 0 ]] = $Php2Html_TmpArray [ 1 ];
18 }
19 // echo '假靜態:$_GET變數
';
20 print_r ( $_GET ); // Array ( [id|1@action|2] => [id] => 1 [action] => 2 )
21 echo "
" ;
22 echo " " ;
23 echo $_GET [id] . "
" ; // 1
24 echo $_GET [action]; // 2
25 ?>
26
1 2 // 偽靜態方法二
3
4 // localhost/php100/test.php/1/2
5 $filename = basename ( $_SERVER [ ' SCRIPT_NAME ' ]);
6 echo $_SERVER [ ' SCRIPT_NAME ' ] . "
" ; // /php100/test.php
7 echo $filename . "
" ; // test.php
8
9 if ( strtolower ( $filename ) == ' test.php ' ){
10 if ( ! empty ( $_GET [id])){
11 $id = intval ( $_GET [id]);
12 echo $id . "
" ;
13 $action = intval ( $_GET [action]);
14 echo $action . "
" ;
15 } else {
16 $nav = $_SERVER [ ' REQUEST_URI ' ];
17 echo " 1: " . $nav . "
" ; // /php100/test.php/1/2
18 $script = $_SERVER [ ' SCRIPT_NAME ' ];
19 echo " 2: " . $script . "
" ; // /php100/test.php
20 $nav = ereg_replace ( " ^ $script " , "" , urldecode ( $nav ));
21 echo $nav . "
" ; // /1/2
22 $vars = explode ( " / " , $nav );
23 print_r ( $vars ); // Array ( [0] => [1] => 1 [2] => 2 )
24 echo "
" ;
25 $id = intval ( $vars [ 1 ]);
26 $action = intval ( $vars [ 2 ]);
27 }
28 echo $id . ' & ' . $action ;
29 }
30 ?>
31
1 2 // 偽靜態方法三
3
4
5 function mod_rewrite(){
6 global $_GET ;
7 $nav = $_SERVER [ " REQUEST_URI " ];
8 echo $nav . "
" ;
9 $script_name = $_SERVER [ " SCRIPT_NAME " ];
10 echo $script_name . "
" ;
11 $nav = substr ( ereg_replace ( " ^ $script_name " , "" , urldecode ( $nav )) , 1 );
12 echo $nav . "
" ;
13 $nav = preg_replace ( " /^.ht(m){1}(l){0,1}$/ " , "" , $nav ); // 這句是去掉尾部的.html或.htm
14 echo $nav . "
" ;
15 $vars = explode ( " / " , $nav );
16 print_r ( $vars );
17 echo "
" ;
18 for ( $i = 0 ; $i < Count ( $vars ); $i += 2 ){
19 $_GET [ " $vars [ $i ] " ] = $vars [ $i + 1 ];
20 }
21 return $_GET ;
22 }
23 mod_rewrite();
24 $year = $_GET [ " year " ]; // 結果為'2006'
25 echo $year . "
" ;
26 $action = $_GET [ " action " ]; // 結果為'_add'
27 echo $action ;
28 ?>
29
1 2 // 偽靜態方法四
3
4 //利用server變數 取得PATH_INFO資訊 該例中為 /1,100,8630.html 也就是執行指令碼名後面的部分
5 if (@ $path_info = $_SERVER [ " PATH_INFO " ]){
6 // 正則匹配一下參數
7 if ( preg_match ( " /\/(\d+),(\d+),(\d+)\.html/si " , $path_info , $arr_path )){
8 $gid = intval ( $arr_path [ 1 ]); // 取得值 1
9 $sid = intval ( $arr_path [ 2 ]); // 取得值100
10 $softid = intval ( $arr_path [ 3 ]); // 取得值8630
11 } else die ( " Path:Error! " );
12 // 相當於soft.php?gid=1&sid=100&softid=8630
13 } else die ( ' Path:Nothing! ' );
14 ?>
15
如果不想使用php來實現偽靜態,可是使用 apache,nginx,iis 等伺服器內建的url rewrite 功能進行設定。
參考資料:
http://baike.baidu.com/view/1570373.htm?fr=ala0_1#2
http://blog.sina.com.cn/s/blog_4a657b6b0100gdnk.html
http://www.chinaz.com/Webbiz/Exp/01041029142010.html
http://apps.hi.baidu.com/share/detail/5308118