原地址:http://blog.sina.com.cn/s/blog_bd418dfa0102wser.html
服務器腳本以php為例
一、偽靜態是個啥?
1、說起偽靜態基本上搞web開發的人,多多少少都有了解與使用,有人會說什么時候會使用偽靜態?使用原生的url地址不是蠻好的嗎,確實是這樣的,其實我蠻喜歡原生的url風格的,但是由於某些原因我不得不使用偽靜態。
比如:
(1), url地址比較友好,看着爽,更有說服務力
(2), 如果是一個內容站,有利於seo優化
(3), 有效的防止sql注入,讓別人不知道你真實的url地址
(4), 比如你在公司上班,你的領導,可能就會讓你設置偽靜態,工作需要。
2、那說了好處,有沒有壞處呢? 壞處肯定是有的,與原生的url比較在性能上,不如原生的url,簡單的說偽靜態就是在服務器上又進行了一層url解析,消耗服務器資源。當然了這點消耗與優點相比,我們還是可以接受的。
3、那偽靜態長什么樣呢?
比如:
http://www.xxab.com/hello/world.html
http://www.xxx.com/content/23223.html
http://www.xxx.com/content/go/cb
以上這樣的url地址,我們就可以叫偽靜態url(都是進行過url處理)
4、那原生的url地址是什么樣呢?
比如:
http://www.xxx.com/index.php?name=will&age=20
http://www.xxx.com/content/list.php?id=3
以上這樣的url地址,就是原生url
二、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; 這句就是去加載偽靜態文件,把所有的規則寫在這里面,注意這里要使用全路徑,不然不成功。