在下面的代码中,index指令将page1.htm
添加到/
个请求。所以我希望http://DOMAIN
的完全匹配与第二个位置块匹配,而不是第一个。
index page1.htm;
location = /
{
rewrite / /page2.htm;
}
location = /page1.htm
{
rewrite /page1.htm /page3.htm;
}
但它是匹配的第一个位置。 http://DOMAIN
给了我page2.htm
,http://DOMAIN/page1.htm
给了我page3.htm.
=
前缀启用了什么样的完全匹配?
我浏览了很多文档,但我不清楚这里发生了什么。如果删除了第一个位置,则http://DOMAIN
会向我page3.htm
,因此在尝试位置匹配之前,它似乎正在使用索引。所以在上面的例子中,为什么在应用索引之后location = /
匹配uri变为/page1.htm
?
在没有首先应用索引的情况下测试位置,然后仅在没有匹配的情况下测试位置,是否应用索引再次测试?
答案 0 :(得分:2)
我发布了答案,以防其他人正在研究这个相当模糊的问题。进一步测试揭示了以下内容:
当uri到达服务器块时,它会被解析
没有应用index
指令的地点。
如果生成的路径解析为有效目录,并且存在index
指令,则索引中的文件名将按顺序排列
附加到路径并进行测试以查看是否存在有效文件。
如果步骤2导致路径发生变化(通过添加存在的索引文件名),则会使用新路径再次解析位置。
答案 1 :(得分:0)
网址http://example.com
和http://example.com/
实际上与HTTP完全相同。两者都将作为
GET / HTTP/1.1
Host: example.com
... other headers
意味着路径部分永远不会为空,并始终以斜杠/
开头。在这种情况下,很明显,您对http://example.com
的请求最终会在page2.htm
。
分步骤:
/
并将请求重写为/page2.htm
/page2.htm
的位置,所以nginx只提供了静态文件。您可以看到此处index
从未使用过。
答案 2 :(得分:-1)
nginx documentation非常明确:
位置可以由前缀字符串或正则表达式定义。使用前面的“〜*”修饰符(对于不区分大小写的匹配)或“〜”修饰符(对于区分大小写的匹配)指定正则表达式。为了找到与给定请求匹配的位置,nginx首先检查使用前缀字符串(前缀位置)定义的位置。其中,选择并记住具有最长匹配前缀的位置。然后按照它们在配置文件中的出现顺序检查正则表达式。正则表达式的搜索在第一次匹配时终止,并使用相应的配置。如果找不到与正则表达式的匹配,则使用先前记住的前缀位置的配置。
...
此外,使用“=”修饰符可以定义URI和位置的精确匹配。如果找到完全匹配,搜索将终止。