一、 location 的匹配符
1.等于匹配符:=
等于匹配符就是等号,特点可以概括为两点:
精确匹配
不支持正则表达式
2.空匹配符
空匹配符的特点是:
匹配以指定模式开始的 URI
不支持正则表达式
3.正则匹配符:~
正则匹配符是可以使用正则表达式的匹配符。不过这里要强调的是,

一般来说~是指:区分大小写的正则匹配
而~*表示:         不区分大小写的正则匹配
但是对于一些对大小写不敏感的操作系统,这两者没有区别。 

^~表示只匹配字符串,不查询正则表达式

二、优先级的实例

location ~ ^/poechant$ {
   return  400;
}

location =/poechant {
  return  403;
}

结果显示 403 forbdden

location ~ ^/poechant$ {
   return  400;
}

location /poechant {
  return  403;
}

结果显示 400 Bad Request

根据以上可以大体判断了解  location的优先级别以及流程。

还需要验证是不是事实

1、首先精确匹配 也就是带着 =的location  找到之后直接结束解析过程并返回。

2、其次匹配普通匹配,并记录最长的匹配,此时首先不返回。匹配最长的。

3、再匹配正则表达式,以~开始的,正则表达式,按照顺序从上到下匹配,找到匹配之后立即返回,没有匹配到则返回普通匹配的最长的匹配。如果普通匹配没有匹配到页面,则返回 404 not found。

优先级别    精准匹配 = >正则匹配 >普通匹配(比如 /a   /a/1.jpg 等 包括 ^~表示之匹配字符串不查询正则表达式)

 

#1 
location / {
     return 404; 
}

#2
#location /a/ {
#    return 404;
#}

#3
location ~* \.jpg$ {
    return 403;
}

#4
location ~ ^/a/ {
   return 404;
}


#5
location ^~ /a/ {
    return 402;
}

#6
location  /a/1.jpg {
    return 401;
}

#7
location = /a/1.jpg {
    return 400;
}

 

测试的时候,先要将#2全部注释掉,不然会认为#2 与#4 完全一样。会提示:重复配置,提示如下

[emerg]: duplicate location "/a/" in D:\nginx-0.8.7/conf/nginx.conf:53

每一次都访问 localhost:8080/a/1.jpg

第一次访问  说明匹配 #7 精准匹配

 

 

把7注释掉  然后访问     说明 3正则匹配匹配成功

接下来互换3跟4

#4
location ~ ^/a/ {
   return 404;
}

#3
location ~* \.jpg$ {
    return 403;
}

再一次访问   说明正则表达式 是按照从上往下的顺序匹配的  匹配成功就停止  同时也验证了 匹配的顺序是 首先 匹配普通匹配  并记录最长的匹配   然后匹配正则表达式 ,找到之后

停止匹配。

把 3、4注释掉   访问  匹配 6成功  普通匹配匹配最长的

注释掉 6之后  匹配5成功   ^~ 以指定的 模式开始的