NginX“位置”块选择算法

时间:2015-05-05 19:30:36

标签: nginx

由于可以定义具有不同模式的多个位置块,因此当Nginx收到请求时,它会搜索与请求的URI最匹配的位置块。

我在配置文件中指定位置块的顺序无关紧要。 Nginx将按特定顺序搜索匹配的模式:

  1. 使用=修饰符的位置块:如果指定的字符串完全匹配 请求的URI,Nginx保留位置块。

  2. 没有修饰符的位置块:如果指定的字符串与 请求的URI,Nginx保留位置块。

  3. 带有^〜修饰符的位置块:如果指定的字符串匹配 在请求的URI的开头,Nginx保留位置块。

  4. 带〜或〜*修饰符的位置块:如果正则表达式匹配 请求的URI,Nginx保留位置块。

  5. 没有修饰符的位置块:如果指定的字符串匹配 在请求的URI的开头,Nginx保留位置块。

  6. 因此,在以下情况中:

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

    有人告诉我,在这种情况下,第一个块中指定的字符串现在与请求的URI完全匹配。因此,Nginx更喜欢正则表达式。

    我的问题是为什么? NginX应该选择第二个块(优先级3),因为它具有比第一个块(优先级5)更好(更低)的优先级。

    有人可以澄清为什么NginX仍会选择第二块?

    提前致谢。

1 个答案:

答案 0 :(得分:2)

以下是documentation关于该问题:

  

要查找与给定请求匹配的位置,nginx首先检查使用前缀字符串(前缀位置)定义的位置。其中,选择并记住具有最长匹配前缀的位置。然后按照它们在配置文件中的出现顺序检查正则表达式。正则表达式的搜索在第一次匹配时终止,并使用相应的配置。如果找不到与正则表达式的匹配,则使用先前记住的前缀位置的配置。

根据文档,nginx必须选择regexp位置。我通过在我的配置中添加以下块来测试它:

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

以下是测试结果,正如预期的那样,使用正则表达式位置:

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