- nginx是一個開源的,,支持高性能,高并發(fā)的www服務(wù)和代理服務(wù)軟件,。
- nginx因具有高并發(fā)(特別是靜態(tài)資源),,占用系統(tǒng)資源少等特性,,且功能豐富而逐漸流行起來。
- nginx不但是一個優(yōu)秀Web服務(wù)軟件,,還具有反向代理負(fù)載均衡功能和緩存服務(wù)功能,,與lvs負(fù)載均衡及Haproxy等專業(yè)代理軟件相比,Nginx部署起來更為簡單,,方便,;在緩存功能方面,它又類似于Squid等專業(yè)的緩存服務(wù)軟件,。
本文章主要介紹nginx配置文件中l(wèi)ocation詳解
Syntax: location [ = | ~ | ~* | ^~ ] uri { ... } location @name { ... } Default: — Context: server, location
1 ,、[] 表示可選,可以不要,。依據(jù)不同的前綴“= ”,,“^~ ”,“~ ”,,“~* ”和不帶任何前綴,,表達(dá)不同的含義。
2 ,、查詢字符串不在URI范圍內(nèi),。例如:/films.htm?fid=123 的URI 是/films.htm
3、不同前綴,,分2大類,,正則location 和 普通location。
(1)“~ ”和“~* ”前綴表示正則location ,, “~ ”區(qū)分大小寫,,“~* ”不區(qū)分大小寫
(2)其它前綴,,包括“=”,、“^~ ”和“@ ”,以及無任何前綴的都屬于普通location
4,、對于一個特定的 HTTP 請求,,nginx先匹配普通location 再匹配 正則location
普通location 匹配只是臨時結(jié)果,nginx 還需要繼續(xù)檢查正則location ,。如果正則location匹配成功,,臨時結(jié)果將被覆蓋,否則最后結(jié)果是之前匹配的臨時結(jié)果,。
5,、普通location內(nèi)部的匹配原則是 最大前綴匹配
例如: location /prefix/mid/ {} 和 location /prefix/ {} ,,,對于HTTP 請求/prefix/mid/index.html 會匹配 location /prefix/mid/ {}
6,、匹配普通location 后 阻止匹配 正則location 的方法是前面加符號 “^~ ”
^ 表示“非”,,~ 表示“正則”,“^~ ”字符意思是:不要繼續(xù)匹配正則
7,、加“= ”可以阻止正則匹配,,“= ”表示 嚴(yán)格精確匹配
例子1:先普通location ,再正則location
假設(shè) nginx 的配置如下:
server { listen 80; server_name localhost; # 普通 location 以“ / ”開始的 URI 請求,,所有的請求都能被匹配上 location / { root html; index index.html; deny all; #拒絕訪問 } # 以 .html 結(jié)尾的 URI 請求 location ~ \.html$ { allow all; #允許訪問 } # 精確匹配 location /a/1.html { allow all; } }
測試和結(jié)果:
127.0.0.1/ 403 Forbidden 匹配普通location 127.0.0.1/index.html 200 ok 匹配正則location 127.0.0.1/abc.html 404 Not Found 匹配正則location 127.0.0.1/a/1.html 200 ok 匹配普通location的精確匹配
例2:正則匹配
server { listen 80; server_name localhost; # 以 /p/ 開頭,,.html 結(jié)尾的所有 URI 請求 location ~ ^/p/.*\.html$ { deny all; } # .html 結(jié)尾的所有 URI 請求 location ~ \.html$ { allow all; } # 以 /a/ 開頭,.html 結(jié)尾的所有 URI 請求,,本設(shè)置無效 location ~ ^/a/.*\.html$ { deny all; } }
測試和結(jié)果:
127.0.0.1/c.html 404 Not Found 匹配第二個location 127.0.0.1/p/1.html 403 Forbidden 匹配第一個location 127.0.0.1/a/1.html 404 Not Found 匹配第二個location
例3:“@” 前綴 Named Location
假設(shè)配置如下:
server { listen 80; server_name localhost; location / { root html; index index.html index.htm; allow all; } # 設(shè)置404頁面 error_page 404 = @fallback; # 請求代理到 baidu.com location @fallback { proxy_pass https://www.baidu.com; } }