首页 > 代码库 > nginx location规则优先级

nginx location规则优先级

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的前面,否则无效。

nginx location规则优先级