nginx偽靜態之try_files和rewrite講解


原地址: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; 這句就是去加載偽靜態文件,把所有的規則寫在這里面,注意這里要使用全路徑,不然不成功。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM