原文連接:http://blog.sina.com.cn/s/blog_bd418dfa0102wser.htmlphp
服務器腳本以php爲例
1、僞靜態是個啥?
一、提及僞靜態基本上搞web開發的人,多多少少都有了解與使用,有人會說何時會使用僞靜態?使用原生的url地址不是蠻好的嗎,確實是這樣的,其實我蠻喜歡原生的url風格的,可是因爲某些緣由我不得不使用僞靜態。
好比:
(1), url地址比較友好,看着爽,更有說服務力
(2), 若是是一個內容站,有利於seo優化
(3), 有效的防止sql注入,讓別人不知道你真實的url地址
(4), 好比你在公司上班,你的領導,可能就會讓你設置僞靜態,工做須要。
二、那說了好處,有沒有壞處呢? 壞處確定是有的,與原生的url比較在性能上,不如原生的url,簡單的說僞靜態就是在服務器上又進行了一層url解析,消耗服務器資源。固然了這點消耗與優勢相比,咱們仍是能夠接受的。
三、那僞靜態長什麼樣呢?
好比:
http://www.xxab.com/hello/world.html
http://www.xxx.com/content/23223.html
http://www.xxx.com/content/go/cb
以上這樣的url地址,咱們就能夠叫僞靜態url(都是進行過url處理)
四、那原生的url地址是什麼樣呢?
好比:
http://www.xxx.com/index.php?name=will&age=20
http://www.xxx.com/content/list.php?id=3
以上這樣的url地址,就是原生url
2、nginx怎麼設置僞靜態呢?
若是你以前使用過apache的話很簡單的,只要apache有rewrite模塊就能夠了,而後就能夠本身編寫rewrite規則了。
可是nginx若是你不明白原理就麻煩了,但只要明白原理就簡單的,下面的案例都是我本地開發環境的配置,若是講的不太合適的地方,請見諒。
1,nginx配置:
server {
listen 80;
server_name localhost;
access_log logs/localhost.access.log main;
#開啓僞靜態日誌,方便調試
rewrite_log on;
#輸出錯誤日誌,錯誤級別設置爲notice
error_log logs/error-test.log notice;
root html/test;
index index.php index.html;
location / {
try_files $uri $uri/ @aaaaab;
}
//注意使用@符號,否則不成功
location @aaaaab {
include D:/nginx/html/test/.htaccess;
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
2, .htaccess清單
rewrite 語法格式:
rewrite [regex] [replacement] [flag];
url正則表達式 替換真實url 標記(last,break)
實例:
rewrite ^/article/index.html$ /index.php?process=article&a=index last;
//注意,這是一行,因爲一行寫不下,自動換行了
rewrite ^/article/list/([0-9]+)-([0-9]+)-([0-9]+).html$
/index.php?process=article&a=list&group_id=$1&category_id=$2&p=$3 last;
rewrite ^/article/detail/([0-9]+).html$ /detail.php?id=$1 last;
rewrite ^/group/([0-9]+).html$ /group.php?group_id=$1 last;
3,上面的案例雖然小,可是五臟俱全,咱們開始一個一個的分析
try_files $uri $uri/ @aaaaab; 這句話是什麼意思?
try_files從字面上理解就是嘗試文件,再結合環境理解就是「嘗試讀取文件」,那他想讀取什麼文件呢,
答:讀取靜態文件
$uri 這個是nginx的一個變量,存放着用戶訪問的地址,
好比:http://www.xxx.com/index.html, 那麼$uri就是 /index.html
$uri/ 表明訪問的是一個目錄,好比:http://www.xxx.com/hello/test/ ,那麼$uri/就是 /hello/test/
完整的解釋就是:try_files 去嘗試到網站目錄讀取用戶訪問的文件,若是第一個變量存在,就直接返回;
不存在繼續讀取第二個變量,若是存在,直接返回;不存在直接跳轉到第三個參數上。
好比用戶訪問這個網地址:http://www.xxx.com/test.html
try_files首先會判斷他是文件,仍是一個目錄,結果發現他是文件,與第一個參數 $uri變量匹配。
而後去到網站目錄下去查找test.html文件是否存在,若是存在直接讀取返回。若是不存在直接跳轉到第三個參數,而第三個參數是一個location,而這個location裏面配置的就是rewrite規則。
說到這裏你們就明白了,能看懂上面的配置了。
那有人會問了,還要try_files幹什麼呀,直接使用rewrite不就能夠了嗎?
答:不能夠,由於rewrite這個指令把全部請求過來的url地址,都與htaccess文件中的正則地址進行一次匹配,這樣的話,靜態的url地址也進行了一次匹配,好比http://xxxx.com/aa.png,這個地址是不須要重寫的,可是rewrite也進行了一次匹配,這就浪費服務器資源,影響執行效率。而咱們真正須要匹配的,其實都是一些動態url地址,若是我說這麼多,你還不明白的話,能夠打印日誌查看。
include D:/nginx/html/test/.htaccess; 這句就是去加載僞靜態文件,把全部的規則寫在這裏面,注意這裏要使用全路徑,否則不成功。