nginx中location有几种:
1.前缀,可以有=或^~修饰,比如
location / /开头的
location /img/ /img/开头的
location = /a.htm 刚好/a.htm
location ^~ /d 匹配后不再检查正则表达式location。注意这个意思不是非正则表达式!除了~开头其他都是非正则表达式,也就是前缀匹配
2.正则表达式,固定~或~*(不区分大小写)开头,比如:
location ~ \.html$
location ~* \.gif$
同时有多个location时,优先级如下:
1.Test the URI against all prefix strings.
和所有前缀比较
2.The = (equals sign) modifier defines an exact match of the URI and a prefix string. If the exact match is found, the search stops.
某个匹配前缀有=,则结束匹配
3.If the ^~ (caret-tilde) modifier prepends the longest matching prefix string, the regular expressions are not checked.
最长匹配的有 ^~ 则结束匹配
4.Store the longest matching prefix string.
保存最长匹配
5.Test the URI against regular expressions.
再检查 ~开头的正则表达式
6.Break on the first matching regular expression and use the corresponding location.
第一个匹配的正则表达式,结束匹配
7.If no regular expression matches, use the location corresponding to the stored prefix string.
没有正则匹配,则使用刚才最长前缀
所以,nginx的location中,~开头的正则表达式配置顺序会影响效果,而非~开头的前缀匹配则和配置顺序完全无关。
建议按如下顺叙写配置文件:
# =开头的精确前缀匹配优先最高
location = /a.html{}
# ^~开头的,禁止再匹配正则的前缀匹配
location ^~ /img{}
#但是这里注意 ,如果后面有 location /img/abc{},且能匹配,那么上面这条无法匹配
#所以建议一旦一个前缀以^~开头,则其下的前缀配置也都用^~
# 正则表达式,注意这部分需要考虑配置顺序
location ~ \.*.htm$ {} #/a/b.htm匹配这个而不是下面的,仅仅因为这行在前
location ~ ^\/a {}
# 其他非 ^~ 与=开头的前缀匹配,虽然顺序无关,但建议把长的放前面
location /abc/df {}
#最后匹配的
location / {}
这样检查配置时,从上往下,匹配了,就不用看后面的了