nginx location指令

oOo右右發表於2019-01-28

指令作用

匹配指定的URI(uri指路徑不包含引數和域名+埠【套接字】)

 

語法形式

官網:http://nginx.org/en/docs/http/ngx_http_core_module.html#location

Syntax:

location [ = | ~ | ~* | ^~ ] uri { ... }

location @name { ... }

Default:

Context:

server, location

 

location = /uri =表示精確字首匹配,只有完全匹配上才生效

location /uri 不帶任何修飾符字首匹配,/pay 匹配到/pay或/pay/end或/pay/xxx

location / 匹配所有路徑,因為uri都是以/開頭的

location ^~ uri ^~表示只匹配普通字串,不匹配正規表示式

location ~ pattern ~表示正規表示式匹配,不忽略大小寫

location ~* pattern ~*表示正規表示式匹配,忽略大小寫

location @xxx @ 是用來定義named location的可以理解為除了普通字串、正規表示式外的第三中模式;不是用來處理普通http請求,用來處理“內部重定向”

 

匹配模式和順序

匹配字串分為兩種:普通字串(literal string)和正規表示式(regular expression,

其中~、~*用於正規表示式,其他字首=、^~ 、沒有字首、@ 用於普通字串;

 

匹配順序: 1.先匹配普通字串,將最準確的暫時儲存起來;(普通字串之間是沒有順序的只有最準確匹配)

2.然後按照配置檔案中正規表示式中宣告的順序進行匹配,只要匹配到一條正規表示式,則停止匹配,取正規表示式的匹配結果;(正規表示式之間是有順序)

3.如果正規表示式沒有匹配成功,則取1中的匹配結果;

4.如果正規表示式和普通字串都沒有匹配到,則返回一個404NOT FOUND;

 

⚠️⚠️⚠️:正則匹配會根據匹配順序,找到第一個匹配的正規表示式後將停止搜尋。普通字串匹配則無視順序,只會選擇最精確的匹配。

 

完成下面一個小需求:

 

 

常用的配置指令:alias、root、proxy_pass

1.alias:別名設定,用於訪問檔案系統,在匹配到location的uri後指向alias配置的路徑:只能用於location裡面

 

location /test {

alias /data/files/; # 最後必須加一個/

}

請求/test/1.txt,將會返回檔案/data/files/1.txt;alias其實返回的是alias後面的路徑+去掉location路徑/檔名

 

alias匹配在正則匹配的location內,則正規表示式必須包含捕獲語句也就是加一個英文括號(),而且alias中也要引用這些捕獲值;

第一個()裡面的內容可以用$1獲取到,第二個()裡面的內容可以用$2獲取到,如:

location ~* /image/(.+\.(png|jpg|jpeg)) {

alias /data/files/$1;

}

請求只要匹配到正則,例如/test/image/1.png或者/image/1.png,都會轉為請求/data/files/1.png

 

2.root:根路徑配置,用於訪問檔案系統,不一定要用在location裡面。在匹配到location的uri後執行root配置路徑拼接location匹配的路徑:

 

location /test {

root /data/files; # 最後不能加/

}

請求/test/2.doc,root會轉到 /data/files/test/2.doc =====》也就是root後配置的路徑+location的路徑;

 

3、proxy_pass——反向代理配置,用於代理請求,適用於前後端負載分離或多臺機器、伺服器負載分離的場景,在匹配到location配置的URL路徑後,轉發請求到proxy_pass配置額URL,是否會附加location配置路徑與proxy_pass配置的路徑後是否有"/"有關,有"/"則不附加,如

 

location /test {

proxy_pass http://192.168.1.1:8080/;

}

訪問/test/i.txt會轉到http://192.168.1.1:8080/i.txt (沒有帶location路徑的,因為proxy_pass後帶了“/”)

 

location = /test/haha {

proxy_pass http://192.168.1.1:8080;

}

訪問/test/haha會轉到http://192.168.1.1:8080/test/haha (有帶location路徑的,因為proxy_pass後沒有帶“/”)

 

收藏幾片文章:

https://www.cnblogs.com/lidabo/p/4169396.html

https://segmentfault.com/a/1190000002797606

 

 

 

 

 

 

 

 

 

相關文章