由于可以使用不同的模式定义多个位置块,因此当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仍然会选择第二个区块吗?
先谢了。
1条答案
按热度按时间3qpi33ja1#
以下是关于这个问题的文档:
为了找到与给定请求匹配的位置,nginx首先检查使用前缀字符串定义的位置(前缀位置)。其中,选择并记住具有最长匹配前缀的位置。然后按照正则表达式在配置文件中出现的顺序检查正则表达式。正则表达式的搜索在第一个匹配时终止,如果没有找到与正则表达式的匹配,则使用前面记住的前缀位置的配置。
根据文档,nginx必须选择regexp location。我通过在配置中添加以下块来测试它:
字符串
下面是测试结果,正如预期的那样,使用了regexp location:
型