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