由于可以定义具有不同模式的多个位置块,因此当Nginx收到请求时,它会搜索与请求的URI最匹配的位置块。
我在配置文件中指定位置块的顺序无关紧要。 Nginx将按特定顺序搜索匹配的模式:
使用=修饰符的位置块:如果指定的字符串完全匹配 请求的URI,Nginx保留位置块。
没有修饰符的位置块:如果指定的字符串与 请求的URI,Nginx保留位置块。
带有^〜修饰符的位置块:如果指定的字符串匹配 在请求的URI的开头,Nginx保留位置块。
带〜或〜*修饰符的位置块:如果正则表达式匹配 请求的URI,Nginx保留位置块。
没有修饰符的位置块:如果指定的字符串匹配 在请求的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仍会选择第二块?
提前致谢。
答案 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