Nginx 中的地址(location)
語法: location [=|~|~*|^~|@] /uri/ { ... }
默認(rèn)值: no
上下文: server
location可以配置依賴于URI的請求,根據(jù)不同的規(guī)則將請求轉(zhuǎn)發(fā)到相應(yīng)的后端服務(wù)器上。location的path規(guī)則支持正則表達(dá)式。 為了使用正則表達(dá)式,必須使用下面的匹配符:
- ~* 不區(qū)分大小寫的正則表達(dá)式
- ~ 區(qū)分大小寫的正則表達(dá)式
匹配的規(guī)則是優(yōu)先使用常量字符串(非正則表達(dá)式),如果任何一個常量字符串匹配就停止匹配,返回匹配的結(jié)果。如果常量字符串不匹配就匹配正則表達(dá)式,找到第一個匹配的正則表達(dá)式規(guī)則就停止匹配,返回匹配的結(jié)果。如果正則表達(dá)式也不匹配就匹配URL的PATH(一級一級往上匹配,最終到/)。
"="僅僅匹配URI完全一樣的地址。顯然正則表達(dá)式的匹配速度是慢于字符串的直接匹配的,所以如果一個地址是頻繁訪問的話,使用"="可以提高匹配的速度。
任何一條不使用 "=" 或者 "^~" 前綴的常量字符串規(guī)則匹配就立即停止終止匹配。 小結(jié),匹配規(guī)則如下:
- 匹配"="的規(guī)則,如果完全匹配,終止匹配。
- 匹配普通字符串,如果匹配帶有"^~"前綴的,終止匹配。
- 匹配正則表達(dá)式,匹配的順序按照配置文件中的定義順序。
- 如果規(guī)則3匹配一個結(jié)果就終止匹配,否則使用規(guī)則2中的結(jié)果。
特別強調(diào)的是,nginx不匹配編碼后的字符串,比如"/images/%20/test"中帶有一個空格,那么必須使用"/images/ /test"才能匹配,而不是使用編碼后的字符。
下面是一個例子。
location = / { #僅僅匹配地址"/" [規(guī)則A] } location / { # 匹配任何一個以"/"開頭的地址,所以說基本上匹配所有地址,但是正則表達(dá)式可能優(yōu)先于此匹配。 [規(guī)則B] } location ^~ /images/ { # 匹配任何以"/images"開頭的地址,此匹配規(guī)則要優(yōu)先于正則表達(dá)式。 [規(guī)則C] } location ~* \.(gif|jpg|jpeg)$ { # 匹配任何以"gif", "jpg", 或者".jpeg"結(jié)尾的地址。但是"/images/"目錄中的文件會被規(guī)則C優(yōu)先匹配。 [規(guī)則D] }
例如下面一些請求:
/ -> 規(guī)則A /documents/document.html -> 規(guī)則B /images/1.gif -> 規(guī)則C /documents/1.jpg -> 規(guī)則D
四種規(guī)則可以以任何順序在配置文件中定義,同一條規(guī)則多條正則表達(dá)式匹配時,依賴其在配置文件中的順序。另外,嵌套的location可能導(dǎo)致未知的匹配結(jié)果。