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