前言
關於偽靜態話題,眾說紛紜。我不是很在意這些討論,但是有一些大牛給出的看法確實是很有味道的, 而且也是比較的公正。
使用了偽靜態話,會耗費CPU資源,但是對於SEO什麼的更加有益;
不適用偽靜態而是使用純靜態(如html)的話,會造成硬碟讀寫瓶頸;
不管怎樣,秉承學習新知識的理念,瞭解一下偽靜態實現還是挺好的。與JavaWeb中實現偽靜態思路有點不太一致(但是原理其實上是一致的啦,不過多解釋了)。PHP中實現微靜態稍稍的複雜了一點點,但是卻更加的靈活了,維護起來也很方便。
PHP 偽靜態
關於PHP實現偽靜態方法不僅可以在路由方面解決,還可以藉助apache,ngnix伺服器等方式來實現。今天剛好遇到了這麼話題,在此做下記錄,以備不時之需。
使用apache實現偽靜態
藉助於Apache伺服器的方式來實現我個人有一點點的理解。類似於做飯。
我們做飯之前是需要有一套廚具的, 然後需要點火,再根據做什麼菜來選擇不同的烹飪方式。
同樣的,本方式原理類似。首先Apache伺服器就是這樣的一套廚具,然後我們開啟“偽靜態方法”就好比點了個火。最後根據不同的重寫規則來完成不同的偽靜態實現。
這樣一來就很容易理解了吧。
第一步:httpd.conf去注釋
在apache伺服器的安裝目錄下找到httpd.conf檔案,然後開啟找到所示的mode_rewrite.so行記錄項,去掉該行最前面的那個#號注釋符即可。
查看此項內容是否開啟可以藉助phpinfo()探針函數來實現。這點比較基礎,在此就不作介紹了。
第二步:更改重寫入權限
下面正式“點火”吧。具體就是在剛才的httpd.conf檔案下找到 AllowOverride None ,然後修改為AllowOverride All,如此即可。
第三步:按需添加偽靜態規則
現在就是具體的重寫規則了。具體的實現方式為在需要進行“偽靜態”的項目的根目錄下添加一個.htaccess 檔案。
通常來說我們會使用這樣的方式來實現PHP的偽靜態化。
代碼借鑒於網路
在.htaccess 檔案中 寫入
<IfModule mod_rewrite.c> RewriteEngine on RewriteRule index.html$ index.php . RewriteRule index-([1-9]+[0-9]*).html$ index.php?p=$1 RewriteRule ([a-z]{1,})-([0-9]{1,}).html$ index.php?action=$1&id=$2</IfModule>
具體的含義如下:
- RewriteRule: 重寫規則,也就是我們的菜譜了,針對每一個規則將按照由上往下的優先順序進行匹配,可以寫多個重寫規則。
重寫規則詳解
規則模板為: 關鍵字RewriteRule 靜態路由 $ 動態PHP路由。切記之間有空格哈。
其實學過Python中一個叫Django的架構的都應該知道啦,其實就是個類似於匹配轉換的過程,一對一轉換。沒學過的這樣一說也應該能很輕鬆的理解啦。
關鍵在於靜態路由可以使用Regex來進行匹配,這樣正好照應了php動態參數的特點。
下面來實戰一下吧。
準備一下代碼,在項目目錄中添加剛才的.htaccess檔案,規則如上。然後添加一個index.php檔案。代碼內容如下:
<?php/** * Created by PhpStorm. * User: ${郭璞} * Date: 2017/1/18 * Time: 11:07 */if($_GET['name']) { echo "Name: ".$_GET['name']."<br />";}if($_GET['age']) { echo "Age: ".$_GET['age']."<br />";}
入門級: RewriteRule index.html$ index.php
嚴格匹配,在瀏覽器中輸入參數為index.html的時候,apache就會把用戶端的請求發往index.php來進行解析。
菜鳥級: RewriteRule index-([a-z0-9]*).html$ index.php?name=$1
下面添加正則匹配的方式實現。
使用PHP動態方式!
使用偽靜態方式(由於漢語編碼問題,這裡使用英文字母代替)
但是如果匹配出錯的情況下就會報404 的錯誤啦。
進階級: RewriteRule ([a-z]{1,})-([0-9]{1,}).html$ index.php?name=$1&age=$2
有了上面的鋪墊了,下面的就不難理解了。規則就是任意的(小寫字母-數字.html形式的路由都會被放置到後面的action參數和id參數上)
總結
嗯,大致就是這麼多了。其實關於偽靜態實現方式,技巧還有很多,這裡簡單的介紹了一下,做個記錄,也算是拋磚引玉咯。
而且有很多項目中的.htaccess檔案寫的真的是 很經典很經典。咱們應該多多的借鑒一下。
最後,今天是2017年大年初一了,祝看到這篇文章的你
新年快樂,新的一年編程freebug.