NginX“Location”区块选择算法

polhcujo  于 5个月前  发布在  Nginx
关注(0)|答案(1)|浏览(70)

由于可以使用不同的模式定义多个位置块,因此当Nginx收到请求时,它会搜索最匹配所请求URI的位置块。
我在配置文件中指定位置块的顺序是无关紧要的。Nginx将按照特定的顺序搜索匹配的模式:
1.带有=修饰符的location块:如果指定的字符串与请求的URI完全匹配,Nginx将保留location块。
1.没有修饰符的location块:如果指定的字符串与请求的URI完全匹配,Nginx将保留location块。
1.带有^~修饰符的location块:如果指定的字符串与请求的URI的开头匹配,Nginx将保留location块。
1.带有~或~* 修饰符的location块:如果正则表达式与请求的URI匹配,Nginx将保留location块。
1.没有修饰符的location块:如果指定的字符串与请求的URI的开头匹配,Nginx将保留location块。
因此,在以下情况下:

server 
{
    server_name website.com;
    location /document 
    {
        […] # requests beginning with "/document"
    }
    location ~* ^/document$ 
    {
        […] # requests exactly matching "/document"
    }
}

字符串
我被告知,在这种情况下,在第一个块中指定的字符串现在完全匹配请求的URI。因此,Nginx更喜欢它而不是正则表达式。
我的问题是为什么?NginX应该选择第二个块(优先级3),因为它的优先级比第一个块(优先级5)更好(更低)。
有人能解释一下为什么NginX仍然会选择第二个区块吗?
先谢了。

3qpi33ja

3qpi33ja1#

以下是关于这个问题的文档:
为了找到与给定请求匹配的位置,nginx首先检查使用前缀字符串定义的位置(前缀位置)。其中,选择并记住具有最长匹配前缀的位置。然后按照正则表达式在配置文件中出现的顺序检查正则表达式。正则表达式的搜索在第一个匹配时终止,如果没有找到与正则表达式的匹配,则使用前面记住的前缀位置的配置。
根据文档,nginx必须选择regexp location。我通过在配置中添加以下块来测试它:

location /document
{
    return 405;
}
location ~* ^/document$
{
    return 406;
}

字符串
下面是测试结果,正如预期的那样,使用了regexp location:

root@terrty:~# curl -I https://example.org/document
HTTP/1.1 406 Not Acceptable
Server: nginx/1.7.10

相关问题