1. 程式人生 > 其它 >nginx偽靜態之try_files和rewrite講解

nginx偽靜態之try_files和rewrite講解

伺服器指令碼以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; 這句就是去載入偽靜態檔案,把所有的規則寫在這裡面,注意這裡要使用全路徑,不然不成功。

轉載 https://blog.csdn.net/NCZB007/article/details/121741896