【问题标题】:NginX "Location" block selection algorithmNginX“位置”块选择算法
【发布时间】:2015-07-15 16:47:59
【问题描述】:

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

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

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

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

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

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

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

因此,在以下情况下:

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

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

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

有人能解释一下为什么 NginX 仍然会选择第二个块吗?

提前致谢。

【问题讨论】:

  • 你的名单是从哪里得到的?根据 Nginx documentation 的说法,有 4 种不同的情况。我将它们从最低到最高优先级排列: 1. 没有修饰符的前缀位置; 2. 用正则表达式定义的位置; 3. 使用 ^~ 修饰符前缀位置; 4. 使用 = 修饰符的确切位置。在您的列表中,第 2 项和第 5 项是相同的,它们定义了最不“重要”的情况。

标签: nginx


【解决方案1】:

这里是documentation 关于那个问题:

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

根据文档 nginx 必须选择正则表达式位置。我已经通过在我的配置中添加以下块来测试它:

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

【讨论】:

  • 上帝,我 nginx 文档。
猜你喜欢
  • 2018-05-20
  • 1970-01-01
  • 2012-05-10
  • 2013-10-25
  • 2021-07-30
  • 1970-01-01
  • 2017-08-11
  • 2017-06-16
  • 1970-01-01
相关资源
最近更新 更多