1.1 語法規則: location [=|~|~*|^~] /uri/ { … }
= 開頭表示精確匹配
^~ 開頭表示uri以某個常規字符串開頭,理解爲匹配 url路徑便可。nginx不對url作編碼,所以請求爲/static/20%/aa,能夠被規則^~ /static/ /aa匹配到(注意是空格)。
~ 開頭表示區分大小寫的正則匹配
~* 開頭表示不區分大小寫的正則匹配
!~和!~*分別爲區分大小寫不匹配及不區分大小寫不匹配 的正則
/ 通用匹配,任何請求都會匹配到。
多個location配置的狀況下匹配順序爲(參考資料而來,還未實際驗證,試試就知道了,沒必要拘泥,僅供參考):
首先匹配 =,其次匹配^~, 其次是按文件中順序的正則匹配,最後是交給 / 通用匹配。當有匹配成功時候,中止匹配,按當前匹配規則處理請求。
例子,有以下匹配規則:php
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 }
那麼產生的效果以下:
訪問根目錄/, 好比http://localhost/ 將匹配規則A
訪問 http://localhost/login 將匹配規則B,http://localhost/register 則匹配規則H
訪問 http://localhost/static/a.html 將匹配規則C
訪問 http://localhost/a.gif, http://localhost/b.jpg 將匹配規則D和規則E,可是規則D順序優先,規則E不起做用,而 http://localhost/static/c.png 則優先匹配到規則C
訪問 http://localhost/a.PNG 則匹配規則E,而不會匹配規則D,由於規則E不區分大小寫。
訪問 http://localhost/a.xhtml 不會匹配規則F和規則G,http://localhost/a.XHTML不會匹配規則G,由於不區分大小寫。規則F,規則G屬於排除法,符合匹配規則可是不會匹配到,因此想一想看實際應用中哪裏會用到。
訪問 http://localhost/category/id/1111 則最終匹配到規則H,由於以上規則都不匹配,這個時候應該是nginx轉發請求給後端應用服務器,好比FastCGI(php),tomcat(jsp),nginx做爲方向代理服務器存在。css
因此實際使用中,我的以爲至少有三個匹配規則定義,以下:
#直接匹配網站根,經過域名訪問網站首頁比較頻繁,使用這個會加速處理,官網如是說。
#這裏是直接轉發給後端應用服務器了,也能夠是一個靜態首頁
# 第一個必選規則html
location = / { proxy_pass http://tomcat:8080/index }
# 第二個必選規則是處理靜態文件請求,這是nginx做爲http服務器的強項linux
# 有兩種配置模式,目錄匹配或後綴匹配,任選其一或搭配使用nginx
location ^~ /static/ { root /webroot/static/; } location ~* \.(gif|jpg|jpeg|png|css|js|ico)$ { root /webroot/res/; }
#第三個規則就是通用規則,用來轉發動態請求到後端應用服務器
#非靜態文件請求就默認是動態請求,本身根據實際把握
#畢竟目前的一些框架的流行,帶.php,.jsp後綴的狀況不多了
location / {
proxy_pass http://tomcat:8080/
}web
3、ReWrite語法後端
last – 基本上都用這個Flag。
break – 停止Rewirte,不在繼續匹配
redirect – 返回臨時重定向的HTTP狀態302
permanent – 返回永久重定向的HTTP狀態301centos
一、下面是能夠用來判斷的表達式:
-f和!-f用來判斷是否存在文件
-d和!-d用來判斷是否存在目錄
-e和!-e用來判斷是否存在文件或目錄
-x和!-x用來判斷文件是否可執行
二、下面是能夠用做判斷的全局變量
例:http://localhost:88/test1/test2/test.php
tomcat
$host:localhost $server_port:88 $request_uri:http://localhost:88/test1/test2/test.php $document_uri:/test1/test2/test.php $document_root:D:\nginx/html $request_filename:D:\nginx/html/test1/test2/test.php
三、按照匹配規則,將請求路徑重定向。 服務器
location /act/ { rewrite ^/act/(.*)$ /$1 break; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $remote_addr;#$proxy_add_x_forwarded_for; proxy_pass http://rhythmk.com:7002; #proxy_redirect default; }
4、Redirect語法
server { listen 80; server_name start.igrow.cn; index index.html index.php; root html; if ($http_host !~ 「^star\.igrow\.cn$" { rewrite ^(.*) http://star.igrow.cn$1 redirect; } }
5、防盜鏈
location ~* \.(gif|jpg|swf)$ { valid_referers none blocked start.igrow.cn sta.igrow.cn; if ($invalid_referer) { rewrite ^/ http://$host/logo.png; } }
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; }
8、多個自動規則制定到同一代理:
location ~*^(/wap|/w|/w1|/u|/get\-business\-scope)$ { proxy_pass http://127.0.0.1:8251; } /* 等價於: = /wap = /w = /w1 = /u = /get-business-scope */
http://dwz.stamhe.com/index.php?_a=index&_m=show&count=10 remote_addr 客戶端ip,如:192.168.4.2 binary_remote_addr 客戶端ip(二進制) remote_port 客戶端port,如:50472 remote_user 已經通過Auth Basic Module驗證的用戶名 host 請求主機頭字段,不然爲服務器名稱,如:dwz.stamhe.com request 用戶請求信息,如:GET /?_a=index&_m=show&count=10 HTTP/1.1 request_filename 當前請求的文件的路徑名,由root或alias和URI request組合而成,如:/webserver/htdocs/dwz/index.php status 請求的響應狀態碼,如:200 body_bytes_sent 響應時送出的body字節數數量。即便鏈接中斷,這個數據也是精確的,如:40 content_length 請求頭中的Content-length字段 content_type 請求頭中的Content-Type字段 http_referer 引用地址 http_user_agent 客戶端agent信息,如:Mozilla/5.0 (Windows NT 6.1; WOW64)
AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.57 Safari/536.11 args 如:_a=index&_m=show&count=10 document_uri 與$uri相同,如:/index.php document_root 針對當前請求的根路徑設置值,如:/webserver/htdocs/dwz hostname 如:centos53.localdomain http_cookie 客戶端cookie信息 cookie_COOKIE cookie COOKIE變量的值 is_args 若是有$args參數,這個變量等於」?」,不然等於」",空值,如? limit_rate 這個變量能夠限制鏈接速率,0表示不限速 query_string 與$args相同,如:_a=index&_m=show&count=10 realpath_root 如:/webserver/htdocs/dwz request_body 記錄POST過來的數據信息 request_body_file 客戶端請求主體信息的臨時文件名 request_method 客戶端請求的動做,一般爲GET或POST,如:GET request_uri 包含請求參數的原始URI,不包含主機名,如:」/foo/bar.php?arg=baz」。不能修改。如:/index.php?_a=index&_m=show&count=10 scheme HTTP方法(如http,https),如:http uri 如:/index.php request_completion 若是請求結束,設置爲OK. 當請求未結束或若是該請求不是請求鏈串的最後一個時,爲空(Empty),如:OK server_protocol 請求使用的協議,一般是HTTP/1.0或HTTP/1.1,如:HTTP/1.1 server_addr 服務器地址,在完成一次系統調用後能夠肯定這個值,如:192.168.4.129 server_name 服務器名稱,如:dwz.stamhe.com server_port 請求到達服務器的端口號,如:80
location ^~/search { # 規則1 }
##### 規則2:匹配請求地址以 /search/ 開頭的URL。
location ^~/search/ { # 規則2 }
http://127.0.0.1/search/index.php
,將請求9108站點的文件路徑: 「{根目錄}/search/index.php」。location ^~/search { proxy_set_header Host $host; # proxy_set_header ProxyAlias "search"; proxy_pass http://127.0.0.1:9108; }
http://127.0.0.1/search/index.php
,將請求9108站點的文件路徑:「{根目錄}/index.php 文件,匹配最後一個「/」後的文件。請求路徑 http://127.0.0.1/search/abc/list 匹配 {根目錄}/list
location ^~/search { proxy_set_header Host $host; # proxy_set_header ProxyAlias "search"; proxy_pass http://127.0.0.1:9108/; }