nginx服务器在server块的多个location块中搜索是否有标准uri和请求字符串匹配,如果有多个可以匹配,就记录下来匹配度最高的一个。然后,服务器再用location块中的正则uri和请求字符串匹配,当第一个正则uri匹配成功,结束搜索,并使用这个location块处理此请求;如果正则匹配全部失败,就使用刚才记录的匹配度最高的location块处理此请求。
location 优先级
nginx 的配置如下
server {
listen 80;
server_name www.nginxtest.me s.nginxtest.me a.nginxtest.me;
root /data/wwwroot/web/nginxtest.me/;
#access_log /data/wwwroot/log/www.nginxtest.me-access.log main_zdy;
access_log on;
error_log /data/wwwroot/log/www.nginxtest.me-error.log;
location / {
return 500;
}
location /testa/bb {
return 501;
}
location /testb {
return 404;
}
location /testb/bb {
return 405;
}
location ~ ^/testa {
return 503;
}
location = /testa {
return 502;
}
location ~ ^/testa/bb {
return 504;
}
location ^~ /testa/bb/cc {
return 403;
}
location ^~ /testa/bb/cc/gg {
return 402;
}
}1) "=" 优先级最高 , 如果匹配成功, 就会停止匹配其他。 所以输入 http://www.nginxtest.me/testa 返回502 但是 http://www.nginxtest.me/testa/ 等是匹配不上的.
2) 如果没有 = 匹配 或者 = 匹配没有匹配上则使用正则匹配。 正则匹配是从上到下一旦匹配上就不会再往下执行(所以上面写的正则应该越精确越好) http://www.nginxtest.me/testa/bb 返回的是503 而不是504
3) 如果正则匹配没有匹配上的, 则按空匹配来查找 。 空匹配的顺序与正则匹配不同,不是按从上到下匹配而是按照精确度来匹配 所以输入http://www.nginxtest.me/testb/bb 返回的是405.
4) 特殊 ^~ 如果^~ 连接的是标准url(一定要是标准uri) 则如果匹配上了则不会在进行正则匹配(它的优先级比正则匹配高)http://www.nginxtest.me/testa/bb/cc http://www.nginxtest.me/testa/bb/cc/dd 返回 403。
这种匹配也是按照精确度来匹配,如我们输入http://www.nginxtest.me/testa/bb/cc/gg 则返回402
综上所述: 如果我们要在一个写了很多location的server下新添加一个比较准确的location则有三种方法
1 如果这个location 的uri是确定则可以使用标准uri 用 = 号匹配
2 如果这个location 的uri只有后面部分不确定则可以使用 ^~ 来匹配。如:location ^~ /testa/bb/cc 这样子在输入http://www.nginxtest.me/testa/bb/cc/dd 或http://www.nginxtest.me/testa/bb/cc?sdfdjf 都是可以匹配上的
3 如果这个uri前面和后面中间都不确定,则需要写一个正则uri。但是正则uri必须在其他可以匹配的location ~ 正则uri的前面,否则无效。
原文:http://bingdonghuoyan.blog.51cto.com/9677664/1592678