nginx location
优先级顺序
location在nginx中的功能是指根据匹配不同的URI请求,做出不同后端响应处理
location基本语法结构,如下
-
location [ = | ~ | ~* | ^~ ] /URI { … }
-
location @/name/ { … }
location匹配顺序
nginx有二层指令来匹配请求的URI,第一层是根据server段定义的server_name常指的就是域名;第二层就是具体的location规则,具体的顺序如下
-
绝对、精确匹配,只要匹配成功则不立即break,不会继续匹配其它的规则
location = /字符串 { }
-
带参前缀匹配,匹配成功停止匹配其它
location ^~ /字符串 { }
-
区分大小写的正则匹配,与之对的 !~,! 就是否定的意思,不匹配
location ~ ^/api { }
location ~ ^/Api { }
-
不分区大小写正则匹配,与这对应的 !~*
location ~* ^/api
对/api /Api都会匹配成功
-
通用匹配,通常是指其它的规则都没有匹配成功走最后一条匹配规则
location / { }
location范例,典型案例
-
按规则优先级匹配,当不指定任何规则,默认是区分大小写匹配
server { server_name website.com; location /doc { return 701; # 用这样的方式,可以方便的知道请求到了哪里 } location ~* ^/document$ { return 702; } }
curl -I website.com:8080/document
返回返回 HTTP/1.1 702
-
按规则的优先级匹配,如下
server { server_name website.com; location /document { return 701; } location ~* ^/document$ { return 702; } }
curl http://website.com/document
返回HTTP/1.1 702
结果还是第二条规则命中 -
按规则的优先级匹配,如下
server { server_name website.com; location ^~ /doc { return 701; } location ~* ^/document$ { return 702; } }
curl http://website.com/document
返回HTTP/1.1 701
^~ 规则命中,匹配立即停止匹配其它规则
- 前缀匹配的优先顺序如下
server { server_name website.com; location /docu { return 701; } location /doc { return 702; } }
curl -I website.com:8080/document
会返回HTTP/1.1 701
server { server_name website.com; location /doc { return 702; } location /docu { return 701; } }
curl -I website.com:8080/document
依然返回 HTTP/1.1 701结论:前缀匹配下,是按字符串的长度作为第一优先级
-
同等级正则匹配,是按照规则的前后顺序
server { listen 8080; server_name website.com; location ~ ^/doc[a-z]+ { return 701; } location ~ ^/docu[a-z]+ { return 702; } }
curl -I website.com:8080/document
返回HTTP/1.1 701
server { listen 8080; server_name website.com; location ~ ^/docu[a-z]+ { return 702; } location ~ ^/doc[a-z]+ { return 701; } }
curl -I website.com:8080/document
返回HTTP/1.1 702
参考文献