語法規則: location [=|~|~*|^~] /uri/ { … }php
其中「~ 」和「~* 」前綴表示正則location ,「~ 」區分大小寫,「~* 」不區分大小寫;其餘前綴(包括:「=」,「^~ 」和「@ 」)和無任何前綴的都屬於普通location 。css
= 開頭表示精確匹配
^~ 開頭表示uri以某個常規字符串開頭,理解爲匹配 url路徑便可。nginx不對url作編碼,所以請求爲/static/20%/aa,能夠被規則^~ /static/ /aa匹配到(注意是空格)。
~ 開頭表示區分大小寫的正則匹配
~* 開頭表示不區分大小寫的正則匹配
!~和!~*分別爲區分大小寫不匹配及不區分大小寫不匹配 的正則
/ 通用匹配,任何請求都會匹配到。
總結一句話: 「正則 location 匹配讓步普通 location 的嚴格精確匹配結果;但覆蓋普通 location 的最大前綴匹配結果」
首先匹配 =,其次匹配^~, 其次是按文件中順序的正則匹配,最後是交給 / 通用匹配。當有匹配成功時候,中止匹配,按當前匹配規則處理請求。
例子,有以下匹配規則:
location = / {
#規則A
}
location = /login {
#規則B
}
location ^~ /static/ {
#規則C
}
location ~ \.(gif|jpg|png|js|css)$ {
#規則D
}
location ~* \.png$ {
#規則E
}
location !~ \.xhtml$ {
#規則F
}
location !~* \.xhtml$ {
#規則G
}
location / {
#規則H
}
那麼產生的效果以下:
因此實際使用中,我的以爲至少有三個匹配規則定義,以下:
#直接匹配網站根,經過域名訪問網站首頁比較頻繁,使用這個會加速處理,官網如是說。
#這裏是直接轉發給後端應用服務器了,也能夠是一個靜態首頁
# 第一個必選規則
location = / {
}
# 第二個必選規則是處理靜態文件請求,這是nginx做爲http服務器的強項
# 有兩種配置模式,目錄匹配或後綴匹配,任選其一或搭配使用
location ^~ /static/ {
root /webroot/static/;
}
location ~* \.(gif|jpg|jpeg|png|css|js|ico)$ {
root /webroot/res/;
}
#第三個規則就是通用規則,用來轉發動態請求到後端應用服務器
#非靜態文件請求就默認是動態請求,本身根據實際把握
#畢竟目前的一些框架的流行,帶.php,.jsp後綴的狀況不多了
location / {
}
未試驗過的其餘信息:
3、ReWrite語法
last – 基本上都用這個Flag。
break – 停止Rewirte,不在繼續匹配
redirect – 返回臨時重定向的HTTP狀態302
permanent – 返回永久重定向的HTTP狀態301
一、下面是能夠用來判斷的表達式:
-f和!-f用來判斷是否存在文件
-d和!-d用來判斷是否存在目錄
-e和!-e用來判斷是否存在文件或目錄
-x和!-x用來判斷文件是否可執行html
二、下面是能夠用做判斷的全局變量
$server_port:88
$document_uri:/test1/test2/test.php
$document_root:/nginx/html #網站根目錄
$request_filename:/nginx/html/test1/test2/test.phplinux
4、Redirect語法
server {
listen 80;
server_name start.igrow.cn;
index index.html index.php;
root html;
if ($http_host !~ 「^star\.igrow\.cn$" {
}
}
5、防盜鏈location ~* \.(gif|jpg|swf)$ {
valid_referers none blocked start.igrow.cn sta.igrow.cn;
if ($invalid_referer) {
}
}
6、根據文件類型設置過時時間
location ~* \.(js|css|jpg|jpeg|gif|png|swf)$ {
if (-f $request_filename) {
expires 1h;
break;
}
}
7、禁止訪問某個目錄
location ~* \.(txt|doc)${
root /data/www/wwwroot/linuxtone/test;
deny all;
}
rewrite ^([0-9]+)\.blog.([a-z]+).ankang06.org
http://$2.blog.ankang06.org/user/index/?uid=$1
#上面這個rewrite例子上面的彩色字符須要注意!!! $1 表明第一個()內的正則匹配到的內容(0-9數字), $2 表明第二個正則匹配到的內容(a-z字符)!!
++ 一些可用的全局變量nginx
$arg_PARAMETER #這個變量包含GET請求中,若是有變量PARAMETER時的值。
$args #這個變量等於請求行中(GET請求)的參數,例如foo=123&bar=blahblah;
$binary_remote_addr #二進制的客戶地址。
$body_bytes_sent #響應時送出的body字節數數量。即便鏈接中斷,這個數據也是精確的。
$content_length #請求頭中的Content-length字段。
$content_type #請求頭中的Content-Type字段。
$cookie_COOKIE #cookie COOKIE變量的值
$document_root #當前請求在root指令中指定的值。
$document_uri #與$uri相同。
$host #請求主機頭字段,不然爲服務器名稱。
$hostname #Set to the machine’s hostname as returned by gethostname
$http_HEADER
$is_args #若是有$args參數,這個變量等於」?」,不然等於」",空值。
$http_user_agent #客戶端agent信息
$http_cookie #客戶端cookie信息
$limit_rate #這個變量能夠限制鏈接速率。
$query_string #與$args相同。
$request_body_file #客戶端請求主體信息的臨時文件名。
$request_method #客戶端請求的動做,一般爲GET或POST。
$remote_addr #客戶端的IP地址。
$remote_port #客戶端的端口。
$remote_user #已經通過Auth Basic Module驗證的用戶名。
$request_completion #若是請求結束,設置爲OK. 當請求未結束或若是該請求不是請求鏈串的最後一個時,爲空(Empty)。
$request_method #GET或POST
$request_filename #當前請求的文件路徑,由root或alias指令與URI請求生成。
$request_uri #包含請求參數的原始URI,不包含主機名,如:」/foo/bar.php?arg=baz」。不能修改。
$scheme #HTTP方法(如http,https)。
$server_protocol #請求使用的協議,一般是HTTP/1.0或HTTP/1.1。
$server_addr #服務器地址,在完成一次系統調用後能夠肯定這個值。
$server_name #服務器名稱。
$server_port #請求到達服務器的端口號。
$uri #不帶請求參數的當前URI,$uri不包含主機名,如」/foo/bar.html」。該值有可能和$request_uri 不一致。$request_uri是瀏覽器發過來的值。該值是rewrite後的值。例如作了internal redirects後。web
解釋更詳細的網址: http://eyesmore.iteye.com/blog/1141660後端
nginx rewrite規則瀏覽器
1帶有問號的目標地址tomcat
www.ankang06.com/user/index/?uid=1118 => http://1118.blog.ankang06.com
服務器
if ($query_string ~* uid=([0-9]*)$)
{
rewrite ^/user/index/(.*)$ http://$id.blog.ankang06.com/? permanent;
}