nginx配置檔案中的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 = / {
#規則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/
}