精确位置匹配如何在nginx中工作?

时间:2016-02-10 03:35:36

标签: nginx nginx-location

在下面的代码中,index指令将page1.htm添加到/个请求。所以我希望http://DOMAIN的完全匹配与第二个位置块匹配,而不是第一个。

index page1.htm;

location = /
    {
    rewrite / /page2.htm;
    }

location = /page1.htm
    {
    rewrite /page1.htm /page3.htm;
    }

但它是匹配的第一个位置。 http://DOMAIN给了我page2.htmhttp://DOMAIN/page1.htm给了我page3.htm.

=前缀启用了什么样的完全匹配?

我浏览了很多文档,但我不清楚这里发生了什么。如果删除了第一个位置,则http://DOMAIN会向我page3.htm,因此在尝试位置匹配之前,它似乎正在使用索引。所以在上面的例子中,为什么在应用索引之后location = /匹配uri变为/page1.htm

在没有首先应用索引的情况下测试位置,然后仅在没有匹配的情况下测试位置,是否应用索引再次测试?

3 个答案:

答案 0 :(得分:2)

我发布了答案,以防其他人正在研究这个相当模糊的问题。进一步测试揭示了以下内容:

  1. 当uri到达服务器块时,它会被解析 没有应用index指令的地点。

  2. 如果生成的路径解析为有效目录,并且存在index指令,则索引中的文件名将按顺序排列 附加到路径并进行测试以查看是否存在有效文件。

  3. 如果步骤2导致路径发生变化(通过添加存在的索引文件名),则会使用新路径再次解析位置。

答案 1 :(得分:0)

网址http://example.comhttp://example.com/实际上与HTTP完全相同。两者都将作为

发送
GET / HTTP/1.1
Host: example.com
... other headers

意味着路径部分永远不会为空,并始终以斜杠/开头。在这种情况下,很明显,您对http://example.com的请求最终会在page2.htm

分步骤:

  1. Nginx找到完全匹配/并将请求重写为/page2.htm
  2. 没有匹配/page2.htm的位置,所以nginx只提供了静态文件。
  3. 您可以看到此处index从未使用过。

答案 2 :(得分:-1)

nginx documentation非常明确:

  

位置可以由前缀字符串或正则表达式定义。使用前面的“〜*”修饰符(对于不区分大小写的匹配)或“〜”修饰符(对于区分大小写的匹配)指定正则表达式。为了找到与给定请求匹配的位置,nginx首先检查使用前缀字符串(前缀位置)定义的位置。其中,选择并记住具有最长匹配前缀的位置。然后按照它们在配置文件中的出现顺序检查正则表达式。正则表达式的搜索在第一次匹配时终止,并使用相应的配置。如果找不到与正则表达式的匹配,则使用先前记住的前缀位置的配置。

     

...

     

此外,使用“=”修饰符可以定义URI和位置的精确匹配。如果找到完全匹配,搜索将终止。