1. 程式人生 > >nginx的配置、虛擬主機、負載均衡和反向代理--03

nginx的配置、虛擬主機、負載均衡和反向代理--03

第3篇主要講 URL路由重寫 和 讀寫分離

nginx中的 location 正則模組

nginx中的URL重寫怎麼做。url重寫模組,主要是在location模組面來實現,我們一點一點的看。

首先看下location 正則匹配的使用。

還記得之前是如何用location來定位.php檔案的嗎?

location ~ \.php$ {
        fastcgi_pass   127.0.0.1:9000; 
        fastcgi_index  index.php;
        include        fastcgi.conf;
    }

我們用~來表示location開啟正則匹配, 這樣:location ~。

還可以用這個來匹配靜態資源,快取它們,設定過期時間:

location ~ .*\.(gif|jpg|jpeg|bmp|png|ico|txt|mp3|mp4|swf){
    expires 15d;
}
location ~ .*\.(css|js){
    expires 12h;
}

expires用來設定HTTP應答中的Expires和Cache-Control的頭標時間,來告訴瀏覽器訪問這個靜態檔案時,不用再去請求伺服器,直接從本地快取讀取就可以了。

expires

語法: expires [time|epoch|max|off]
預設值: expires off
作用域: http
, server, location

可以在time值中使用正數或負數。“Expires”頭標的值將通過當前系統時間加上您設定的 time 值來獲得。

可以設定的引數如下:

epoch 指定“Expires”的值為 1 January, 1970, 00:00:01 GMT。
max 指定“Expires”的值為 31 December 2037 23:59:59 GMT,“Cache-Control”的值為10年。
-1 指定“Expires”的值為 伺服器當前時間 -1s,即永遠過期
負數:Cache-Control: no-cache
正數或零:Cache-Control: max-age = #, # 會轉換為指定時間的秒數。比如:1d、2h、3m。
off 表示不修改“Expires”和“Cache-Control”的值

比如再看個例子:

控制圖片等過期時間為30天

location~ \.(gif|jpg|jpeg|png|bmp|ico)$ {
        expires 30d;
}

我們還可以控制哪一個檔案目錄的時間,比如控制匹配/resource/或者/mediatorModule/裡所有的檔案快取設定到最長時間。

location ~ /(resource|mediatorModule)/ {
        root    /opt/demo;
        expires max;
}

URL重寫模組(Rewrite)

重寫模組與很多模組一起使用。先看一下是怎麼用的,看2個例子,然後我們再一點一點講每個的使用方法:

location /download/ {
  if ($forbidden) {
    return   403;
  }
  if ($slow) {
    limit_rate  10k;
  }
  rewrite  ^/(download/.*)/media/(.*)\..*$  /$1/mp3/$2.mp3    break;
location / {
    root   html;
    index  index.html index.htm;
    rewrite ^/bbs/(.*)$ http://192.168.18.201/forum/$1;
}

上面2個例子就是利用rewrite來完成URL重寫的。我們慢慢來看它的用法。

break 和變成語言中的用法一樣,就是跳出某個邏輯。

break

語法:break 
預設值:none 
使用欄位:server, location, if
if (!-f $request_filename) {
  break;
}

上面這個例子就是在if裡面使用break,意思是如果訪問的檔名不存在,就跳出。後續會有更多的例子。

if

語法:if (condition) { … } 
預設值:none 
使用欄位:server, location

if 判斷一個條件,如果條件成立,則後面的大括號內的語句將執行,相關配置從上級繼承。

可以在判斷語句中指定下列值:

一個變數的名稱;不成立的值為:空字元傳”“或者一些用“0”開始的字串。
一個使用=或者!=運算子的比較語句。
使用符號~*和~模式匹配的正則表示式:
~為區分大小寫的匹配。
~*不區分大小寫的匹配(firefox匹配FireFox)。
!~和!~*意為“不匹配的”。
使用-f和!-f檢查一個檔案是否存在。
使用-d和!-d檢查一個目錄是否存在。
使用-e和!-e檢查一個檔案,目錄或者軟連結是否存在。
使用-x和!-x檢查一個檔案是否為可執行檔案。
我們一一來舉例看看。

if ($http_user_agent ~ MSIE) {
  rewrite  ^(.*)$  /msie/$1  break;
}

$http_user_agent變數獲取瀏覽器的agent,使用~ 來匹配大小寫
使用者如果使用的IE 瀏覽器,就執行if 裡面的操作。

if ($request_method = POST ) {
  return 405;
}

$request_method變數獲取請求的方法,使用=來判斷是否等於POST 。如果複合,就執行if 裡面的操作。

if (!-f $request_filename) {
  break;
  proxy_pass  http://127.0.0.1;
}

$request_filename變數獲取請求的檔名,使用!-f來匹配檔案,如果不是一個檔名,就執行if 裡面的邏輯。

return

語法:return code 
預設值:none 
使用欄位:server, location, if

這個指令結束執行配置語句併為客戶端返回狀態程式碼,可以使用下列的值:204,400,402-406,408,410, 411, 413, 416與500-504。此外,非標準程式碼444將關閉連線並且不傳送任何的頭部。

rewrite

語法:rewrite regex replacement flag 
預設值:none 
使用欄位:server, location, if

rewrite用來重寫url,有3個位置:

regex 表示用來匹配的正則
replacement 表示用來替換的
flag 是尾部的標記:
flag可以是以下的值:

last - url重寫後,馬上發起一個新的請求,再次進入server塊,重試location匹配,超過10次匹配不到報500錯誤,位址列url不變
break - url重寫後,直接使用當前資源,不再執行location裡餘下的語句,完成本次請求,位址列url不變
redirect - 返回302臨時重定向,url會跳轉,爬蟲不會更新url。
permanent - 返回301永久重定向。url會跳轉。爬蟲會更新url。
為空 - URL 不會變,但是內容已經變化,也是永久性的重定向

上面的正則表示式的一部分可以用圓括號,方便之後按照順序用19來引用。

我們來看幾個例子:

我們需要將/photos/123456重寫成/path/to/photos/12/1234/123456.png

可以這樣:

rewrite  "/photos/([0-9] {2})([0-9] {2})([0-9] {2})" /path/to/photos/$1/$1$2/$1$2$3.png;

下面是一些簡單的常見的重寫。

rewrite ^/js/base.core.v3.js /js/base.core.v3.dev.js redirect;
rewrite ^/js/comment.frame.js /js/comment.frame.dev.js redirect;
rewrite ^/live-static/(.*)$ http://live.bilibili.com/public/$1 last;