nginx location指令

指令作用

匹配指定的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

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章