基於php偽靜態的實現方法解析

2022-10-06 02:33:10 字數 4098 閱讀 6085

一直在做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偽靜態的實現四法:

<?php //偽靜態方法一

// localhost/php100/test.php?id|1@action|2

$php2html_fileurl = $_server["request_uri"];

echo $php2html_fileurl."

";// /php100/test.php?id|1@action|2

$php2html_urlstring = str_replace("?","",str_replace("/", "", strrchr(strrchr($php2html_fileurl, "/"),"?")));

echo $php2html_urlstring."

";// id|1@action|2

$php2html_urlquerystrlist = explode("@", $php2html_urlstring);

print_r($php2html_urlquerystrlist);// array ( [0] => id|1 [1] => action|2 )

echo "

"; foreach($php2html_urlquerystrlist as $php2html_urlquerystr)

//echo '假靜態:$_get變數

'; print_r($_get); // array ( [id|1@action|2] => [id] => 1 [action] => 2 )

echo "

"; echo "";

echo $_get[id]."

";// 1

echo $_get[action];// 2

?>

<?php //偽靜態方法二

// localhost/php100/test.php/1/2

$filename = basename($_server['script_name']);

echo $_server['script_name']."

";// /php100/test.php

echo $filename."

";// test.php

if(strtolower($filename)=='test.php')else

echo $id.'&'.$action;

} ?>

<?php //偽靜態方法三

function mod_rewrite()(l)$/","",$n**);//這句是去掉尾部的.html或.htm

echo $n**."

";$vars = explode("/",$n**);

print_r($vars);

echo "

";for($i=0;$i";

$action=$_get["action"];//結果為'_add'

echo $action;

?>

<?php //偽靜態方法四

//利用server變數 取得path_info資訊 該例中為 /1,100,8630.html 也就是執行指令碼名後面的部分

if(@$path_info =$_server["path_info"])else die("path:error!");

//相當於soft.php?gid=1&sid=100&softid=8630

}else die('path:nothing!');

?>

如果不想使用php來實現偽靜態,可是使用 apache,nginx,iis 等伺服器自帶的url rewrite 功能進行設定。

參考資料:

偽靜態的實現方法

偽靜態不是優化效率的方案,它指的是url優化的一種方式。取決於是否存在查詢引數 querystring 動態的url script.php?param value key value 靜態的url pathinfo script.php param value key value.html 靜態化u...

偽靜態的實現方法

偽靜態不是優化效率的方案,它指的是url優化的一種方式。取決於是否存在查詢引數 querystring 動態的url script.php?param value key value 靜態的url pathinfo script.php param value key value.html 靜態化u...

php偽靜態的實現方式

1.根據 server path info 來操作實現。舉個列子比如你的 的位址是 你echo server path info 出來的結果就會是 look id 1.shtml 看到這個我想大家可能已經明白了。完整的demo index.php index.php conn mysql conne...