1. 程式人生 > >nginx配置檔案中的location詳解

nginx配置檔案中的location詳解

一、location語法簡介及用法:
 URL地址匹配是Nginx配置中最靈活的部分.location 支援正則表示式匹配,也支援條件匹配,使用者可以通過location指令實現Nginx對動丶靜態網頁的過濾處理。
1.語法規則: 
location [=|~|~*|^~] /uri/ { 
… 

}

1.1 = 開頭表示精確匹配

1.2 ^~ 開頭表示uri以某個常規字串開頭,理解為匹配 url路徑即可。nginx不對url做編碼,因此請求為/static/20%/aa,可以被規則

^~ /static/ /aa匹配到(注意是空格)。

1.3 ~ 開頭表示區分大小寫的正則匹配

1.4 ~*  開頭表示不區分大小寫的正則匹配

1.5 !~和!~*分別為區分大小寫不匹配及不區分大小寫不匹配 的正則

1.6 / 通用匹配,任何請求都會匹配到。

2.規則分類:

其中“~ ”和“~* ”以及“!~”和“!~*”字首表示正則location .

其他字首(包括:“=”,“^~”和“@ ”)和無任何字首的都屬於普通location .

3.匹配規則: 

普通 location ”的匹配規則是“最大字首.(特殊的是“=”和“^~”,字首指令將嚴格匹配uri ,如果匹配,停止搜尋 .)

正則 location ”的匹配規則是“順序匹配,且只要匹配到第一個就停止後面的匹配.

通用匹配 “/”最後匹配

先匹配普通 location ,再“考慮”匹配正則 location 。注意這裡的“考慮”是“可能”的意思,也就是說匹配完“普通 location ”後,有的時候需要繼續匹配“正則 location ”,有的時候則不需要繼續匹配“正則 location ”。兩種情況下,不需要繼續匹配正則 location :( 1 )當普通 location 前面指定了“ ^~ ”,特別告訴 Nginx 本條普通 location 一旦匹配上,則不需要繼續正則匹配;( 2 )當普通location 恰好嚴格匹配上,不是最大字首匹配,則不再繼續匹配正則.

總結:正則 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
}

那麼產生的效果如下:

訪問根目錄/, 比如http://localhost/ 將匹配規則A  #因為A是精確匹配.

訪問 http://localhost/login 將匹配規則B,http://localhost/register 則匹配規則H

訪問 http://localhost/static/a.html 將匹配規則C

訪問 http://localhost/a.gif 將匹配規則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),nginx作為方向代理伺服器存在。

所以實際使用中,個人覺得至少有三個匹配規則定義,如下:

#直接匹配網站根,通過域名訪問網站首頁比較頻繁,使用這個會加速處理,官網如是說。

#這裡是直接轉發給後端應用伺服器了,也可以是一個靜態首頁

# 第一個必選規則

location = / {
   proxy_pass http://tomcat:8080/index
}
# 第二個必選規則是處理靜態檔案請求,這是nginx作為http伺服器的強項

# 有兩種配置模式,目錄匹配或字尾匹配,任選其一或搭配使用

location ^~ /static/ {
   root /webroot/static/;
}
location ~* \.(gif|jpg|jpeg|png|css|js|ico)$ {
   root /webroot/res/;
}

#第三個規則就是通用規則,用來轉發動態請求到後端應用伺服器

#非靜態檔案請求就預設是動態請求,自己根據實際把握

#畢竟目前的一些框架的流行,帶.php,.jsp字尾的情況很少了

location / {
   proxy_pass http://tomcat:8080/
}