正常匹配的指令为空,即没有指定匹配指令的即为正常匹配。其形式类似 /XXX/YYY.ZZZ正常匹配中的url匹配模式可以使用正则,不区分大小写。
location /demo { rewrite ^ ; }上述模式指的是匹配/demo的url,下面的都能匹配
正常匹配和前缀匹配的差别在于优先级。前缀的优先级高于正常匹配
全匹配全匹配与正常匹配一样,没有匹配指令,匹配的url模式仅一个斜杠/
location / { rewrite ^ ; }全匹配也可以配合 精确匹配和正则匹配一些指令,只不过这样的设定意义不大。通过都会有一个默认的location,这个就是全匹配。
命名匹配命名匹配指的是使用@比绑定一个模式,类似变量替换的用法。
error_page 404 = @not_found location @not_found { rewrite ; }上述的作用是如果访问没有匹配的url会触发404指令,然后就匹配到@not_found 这个 location上。
匹配优先级nginx的匹配优先级遵循一个大原则和两个小细节。
大原则是关于匹配模式的优先级:
精确匹配 > 前缀匹配 > 正则匹配 > 正常匹配 > 全匹配小细节则是同一优先级中:
细节一:正则匹配成功之后停止匹配,非正则匹配成功还会接着匹配。
细节二:在所有匹配成功的url中,选取匹配度最大的url字符地址。
不同级匹配模式优先级原则 精确匹配 > 前缀匹配=精确匹配的优先级最高,这与配置的先后顺序无关
location ^~ /demo{ rewrite ^ ; } location = /demo { rewrite ^ ; }访问
-> baidu.com -> google.com尽管前缀匹配也能匹配/demo这个地址,并且还先命中,可是=的优先级更高。
再把前缀匹配换成正则匹配
location ~ /demo{ rewrite ^ ; } location = /demo { rewrite ^ ; }访问结果仍然一样。精确匹配的优先级最高。
前缀匹配 > 正则匹配 location ~ /[ad]emo{ rewrite ^ ; } location ^~ /demo { rewrite ^ ; }上述两个模式中,第一个使用正则匹配,第二个使用前缀匹配,访问效果如下
-> baidu.com -> google.com由此可见,尽管也是正则匹配先命中规则,可以优先级低,还是让步给前缀匹配。
正则匹配 > 正常匹配 location /demo/aa{ rewrite ^ ; } location ~ /[ad]emo { rewrite ^ ; } -> baidu.com -> baidu.com访问/demo/aa的地址的时候,尽管前者位置在前,并且也匹配最长,可是大规则的优先级,还是要先进行后面的正则匹配。小细节也必须让步大规则。
正常匹配 > 全匹配 location / { rewrite ^ ; } location /demo { rewrite ^ ; }访问结果
-> index.html -> google.comg -> baidu.com -> baidu.com由此可见,全匹配的优先级最低。
同级匹配细节同级的匹配需要注意两个关键细节,是否是正则匹配,是否是最长匹配。
非正则匹配 location /demo { rewrite ^ ; } location /demo/aa { rewrite ^ ; }访问测试
-> google.com -> baidu.com第一个连接只匹配了第一个location,跳转google.com;第二个连接两者都匹配,可是第二个location的匹配字符更长,因此跳转了baidu.com。
把正常匹配换成前缀匹配的效果也一样。
location ^~ /demo { rewrite ^ ; } location ^~ /demo/aa { rewrite ^ ; }访问结果如下:
-> google.com -> baidu.com通过上面的测试,可见同级的非正则的匹配,匹配结果最长的location最终会被命中。其实这个很好理解,匹配的字符越多,优先级越大嘛。但是为什么这个原则要特指非正则的匹配呢?
正则匹配