【发布时间】:2015-07-15 16:47:59
【问题描述】:
由于可以定义多个具有不同模式的位置块,当 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 仍然会选择第二个块吗?
提前致谢。
【问题讨论】:
-
你的名单是从哪里得到的?根据 Nginx documentation 的说法,有 4 种不同的情况。我将它们从最低到最高优先级排列: 1. 没有修饰符的前缀位置; 2. 用正则表达式定义的位置; 3. 使用 ^~ 修饰符前缀位置; 4. 使用 = 修饰符的确切位置。在您的列表中,第 2 项和第 5 项是相同的,它们定义了最不“重要”的情况。
标签: nginx