最新消息:

nginx location 的匹配顺序

nginx admin 3239浏览 0评论

nginx的官方文档location支持以下几种形式的配置,

location [ = | ~ | ~* | ^~ ] uri { ... }
location @name { ... }

 

我们一般也就用三种配置,= 精确匹配,[^~]/ 前缀匹配,~或~* 正则匹配。 这个顺序也是他们匹配的顺序,前缀匹配会最大限度的匹配,例如 /test/ 和 /test/hello 如果你的url是/test/helloworld 会匹配到location /test/hello。

这个匹配规则和你在配置文件中配置的location的先后顺序没有关系,不会因为location /test/ {}location /test/hello {}就让url /test/helloworld 先匹配第一个location。

利用我github ngx_http_hello_world_module 模块测试一下。从github上clone下来以后,编译的时候在configure添加–add-module=./vislee/ngx_http_hello_world_module后编译。

测试配置文件:

location ^~/test0/ {
    hello_world;
    hello_by "by ^~/test0/";
    
    location ^~/test0/hello/ {
        hello_world;
        hello_by "by nested ^~/test0/hello";
    }
    
    location ^~/test0/world/ {
        hello_world;
        hello_by "by nested ^~/test0/world/";
    }
    
}

location ^~/test0/hello/ {
    hello_world;
    hello_by "by ^~/test0/hello";
}

location =/test0/ {
    hello_world;
    hello_by "by =/test0/";
}

location ^~/test {
    hello_world;
    hello_by "by ^~/test";
}

location ^~/test/ {
    hello_world;
    hello_by "by ^~/test/";
}

location ^~/testa {
    hello_world;
    hello_by "by ^~/testa";
}

 

测试结果:

curl -v 'http://127.0.0.1:8080/test0/
hello world by =/test0/%

curl -v 'http://127.0.0.1:8080/test0/test'
hello world by ^~/test0/%

curl -v 'http://127.0.0.1:8080/test0/hello/'
hello world by ^~/test0/hello%

curl -v 'http://127.0.0.1:8080/test0/world/'
hello world by nested ^~/test0/world/%

总结:
先匹配精确匹配的location,也就是配置location = xxx {}的。
其次匹配前缀匹配的location,也就是配置location [^~] xxx {}的。先匹配前缀较长的,相同长度的先匹配字典顺序较大的。
最后匹配正则表达式的location,也就是配置location ~ xxx {}的。

FROM:https://github.com/vislee/

 

转载请注明:爱开源 » nginx location 的匹配顺序

您必须 登录 才能发表评论!