参考文章:
https://www.cnblogs.com/oskyhg/p/9323858.html
http://www.ttlsa.com/nginx/nginx-location-configure/
nginx的url匹配模式很强大,同时使用非常灵活,尤其是优先级的匹配,如果不寻找规律,不但很难掌握,而且容易犯晕。了解优先级之前,先看看匹配的配置语法,以及都有那些匹配模式。
location模板
location [指令模式] [URL匹配模式串] {
}
指定模式
指令模式指用于匹配的方式,即精确匹配,前缀匹配还是正则匹配,当然这个是可选的,如果不写,则退化成正常匹配或者全匹配。
URL匹配模式串
URL匹配模式指的是需要匹配的URL的模式串,注意:/ 通用匹配,任何未匹配到其它location的请求都会匹配到,也就是最后的默认匹配
location 匹配语法(指令模式)
location [=|~|~*|^~] /uri/ { … }
= 表示精确匹配,这个优先级也是最高的
^~ 前缀匹配,表示uri以某个常规字符串开头,理解为匹配 url路径即可。nginx不对url做编码,因此请求为/static/20%/aa,可以被规则^~ /static/ /aa匹配到(注意是空格)。
~ 正则匹配,表示区分大小写的正则匹配
~* 正则匹配,表示不区分大小写的正则匹配(和上面的唯一区别就是大小写)
!~和!~* 正则匹配,分别为区分大小写不匹配及不区分大小写不匹配的正则
如下例子
#匹配通配符
location / {
echo '/';
}
#精确匹配通配符
location = / {
echo '=/';
}
#精确匹配字符串
location = /nginx {
echo '=/nginx';
}
#以.gif|.jpg|.js结尾,区分大小写($ 后面可带参数 ?a=1)
location ~ \.(gif|jpg|js)$ {
echo 'gif|jpg|js';
}
#以.png结尾,不区分大小写($ 后面可带参数 ?a=1)
location ~* \.png$ {
echo 'png'
}
#访问如下
#curl http://www.test.com/
=/
#curl http://www.test.com/nginx
=/nginx
#curl http://www.test.com/1.gif
'gif|jpg|js'
#curl http://www.test.com/1.png
'png'
大原则是关于匹配模式的优先级:
精确匹配 > 前缀匹配 > 正则匹配 > 正常匹配 > 全匹配
小细节则是同一优先级中:
-
细节一:正则匹配成功之后停止匹配,非正则匹配成功还会接着匹配。
-
细节二:在所有匹配成功的url中,选取匹配度最大的url字符地址。